簡體   English   中英

Django Admin Manager替代

[英]Django Admin Manager Override

我有一個多項選擇題,其中模型Question是問題和Choices作為答案。 我想將一個Question可以創建的Choices數量限制為4個。

使用models.Manager來驗證問題的選擇數量。

class Question(models.Model):
    QUESTION_TYPES = (
    ('MC', 'Multiple Choice'),
    ('SB', 'Subjective'),
    )
    question_type = models.CharField(choices=QUESTION_TYPES, max_length=2, default='MC')
    question_text = models.TextField(null=False, blank=False)

Choice

class Choice(models.Model):
    choice_text = models.CharField(max_length=100, null=True)
    question= models.ForeignKey(Question, null=True , related_name='choices')
    is_answer = models.BooleanField(default=False)
    objects = ChoiceManager()

客戶Manager

class ChoiceManager(models.Manager):
    def create(self, **kwargs):
        question = kwargs.pop('question',None)
        if question is not None:
            if question.choices.all().count() > 4:    # see related_name 
                raise AssertionError
            else:
                return self

如果我使用python shell創建模型實例,則一切正常。

但是:當我使用AdminSite時 我可以為一個問題創建4個以上的選擇。 如何在AdminSite上達到所需的行為(在“管理站點”上引發錯誤)? 覆蓋管理員級別的經理? 我將如何進行?

admin.site.register(Question)
admin.site.register(Choice) 

需要重寫模型類本身中的save方法。

class Choice(models.Model):
    choice_text = models.CharField(max_length=100, null=True)
    question= models.ForeignKey(Question, null=True , related_name='choices')
    is_answer = models.BooleanField(default=False)
    objects = ChoiceManager()

    def save(self, *args, **kwargs):
        if self.question.choices.all().count() > 4:
            print "You Shall Not Save"
            raise ValueError
        else:
            print "Super Method Called"
            super(Choice, self).save(*args, **kwargs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM