2012-08-01 144 views
0

我想有一组与个人答案的问题,每个用户都可以回答。 为了实现这种功能,我建立了以下型号:Django模型和管理内联

models.py:

class Question(models.Model): 
    question = models.TextField(null=False) 

class PossibleAnswer(models.Model): 
    question=models.ForeignKey(Question, related_name="possible_answer") 
    answer = models.CharField(max_length=200) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    user = models.ForeignKey(User) 
    real_answer = models.ForeignKey(PossibleAnswer, related_name="real_answer") 

最初管理界面就足够了,这些问题的工作。它应该是可见的“每个问题”的基础上,因而有“问题”应该显示它允许答案和答案的用户可以给:

admin.py:

class AnswerInline(admin.TabularInline): 
    model = Answer 

class PossibleAnswerInline(admin.TabularInline): 
    model = PossibleAnswer 

class QuestionAdmin(admin.ModelAdmin): 
    inlines = [PossibleAnswerInline, AnswerInline] 

admin.site.register(Question, QuestionAdmin) 

一切都很正常,直到我保存了产生IntegrityError的答案。我相信这涉及到对象之间的依赖关系?

第二项我不能让周围的:以限制real_answer实际选项的选择(即都涉及到这个问题),我定义的forms.py如下:

class AnswerForm(ModelForm): 
    class Meta: 
    model = Answer 

    def __init__(self, *args, **kwargs): 
    super(AnswerForm, self).__init__(*args, **kwargs) 
    choices = self.instance.question.possible_answer.all() 
    self.fields["real_answer"].choices = choices 

,并用它admin.py如下:

class AnswerInline(admin.TabularInline): 
    model = Answer 
    form = AnswerForm 

当我运行此,self.instance.question.possible_answer.all()总是提高DoesNotExist

任何指针都非常感谢。

最佳,

安德烈亚斯

回答

0

AnswerForm被初始化,它的实例属性不会总是有与此相关的一个问题对象,所以任何时候你从表单中引用self.instance.question,将DoesNotExist异常将是如果还没有附加到表单答案对象的问题实例,则抛出它。

在窗体的init试试这个代码,而不是方法:

choices = [] 
if self.instance.pk 
    questions = Question.objects.filter(answer=self.instance) 
    if questions.exist(): 
     choices = questions.get().possibleanswer_set.all() 
+0

伟大的方式,它几乎工作。 当django admin显示表单时,是否有限制选项的方法呢?在已有的答案中,它可以工作,但不在底部的新行中。 – 2012-08-01 19:35:39

+0

应该有,是的,请参考Django的管理员(和可能的形式)的文档。 – 2012-08-01 19:45:05

+0

不应该在AnswerForm中吗? – 2012-08-01 20:14:36

0

我主要建立在@ GonzaloDelgado的答案,但我不觉得他的代码是最优的。最好使用try...except块。

from django.core.exceptions import ObjectDoesNotExist 
... 
def __init__(self, *args, **kwargs): 
    super(AnswerForm, self).__init__(*args, **kwargs) 

    if self.instance.pk: 
     try: 
      self.fields['real_answer'].queryset = self.question.possibleanswer_set.all() 
     except ObjectDoesNotExist: 
      pass 
+0

你总是可以编辑我的答案:-) – 2012-08-01 20:17:12

+0

不适合这样的事情。编辑会(并且应该)被拒绝,因为它是一个“根本性的改变:这个编辑在原来的文章中变化太大了,原本的意义或意图将会丢失。” – 2012-08-01 20:24:28

+0

对不起,我不会想到重构我的代码(使其成为“最优”)会失去我的答案的含义或意图。 – 2012-08-01 20:34:57