1

I am working on a project similar to a stock market. In this project I have a model called Stock which is as follows:

class Stock(models.Model):
    _title = models.CharField(max_length=50)
    _description = models.TextField()
    _total_subs = models.IntegerField()
    _sold_out_subs = models.IntegerField()
    _created_at = models.DateTimeField(auto_now_add=True)
    _updated_at = models.DateTimeField(auto_now=True)
    _status = models.BooleanField()

Access to create new records for this model is to be supposed only through the Django admin panel, so in the admin.py file in my app I wrote a class to manage it called StockAdmin as follows:

class StockAdmin(admin.ModelAdmin):
    list_display = []
    readonly_fields = ['_sold_out_subs']
    
    class Meta:
        model = Stock

How can I make a _total_subs so that it can be writable when it being create and then it should be in read-only fields?

Javad
  • 2,033
  • 3
  • 13
  • 23

3 Answers3

1

you can get readonly fields based on object like this

class StockAdmin(admin.ModelAdmin):
    list_display = []

    def get_readonly_fields(self, request, obj=None):
       if obj:
           return ['_sold_out_subs']
       else:
           return []

besides that its not good django practice to start field names with underscore since they imply that the field is a private. check this answer for more info What is the meaning of single and double underscore before an object name?

Jameel Hamdan
  • 301
  • 2
  • 8
1

By adding list_editable = [] add all fields you have except _total_subs

Mohamed Hamza
  • 945
  • 1
  • 5
  • 15
0

Use get_readonly_fields method

class StockAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        return ['_sold_out_subs'] if obj else []
Javad
  • 2,033
  • 3
  • 13
  • 23