Django模型和管理内联线

Django模型和管理内联线,django,django-models,django-forms,django-admin,Django,Django Models,Django Forms,Django Admin,我试图有一套问题,每个用户都可以回答。 为了实现这种功能,我构建了以下模型: 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.Ch

我试图有一套问题,每个用户都可以回答。 为了实现这种功能,我构建了以下模型:

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)
一切都很好,直到我保存了答案,这就产生了一个整数错误。我相信这与对象之间的依赖关系有关

第二项我无法回避:为了将真实答案的选择限制为实际选项(与问题相关),我在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.mably\u answer.all()总是引发DoesNotExist

非常感谢任何指点

最好的


Andreas

当一个
应答表单
被初始化时,它的实例属性并不总是有一个与之相关的问题对象,因此无论何时从表单中引用
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()

我主要基于@GonzaloDelgado的答案,但我觉得他的代码不是最优的。最好使用
try…除了

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

这是一个很好的方法,几乎可以奏效。当django admin显示表单时,是否也有方法限制选项?在已经存在的答案中,它起作用,但在底部的新行中不起作用。应该有,是的,请参阅Django的管理(可能还有表单)文档。这不应该也在AnswerForm中吗?不是这样的。该编辑会(也应该)被拒绝,因为它是一个“根本性的改变:该编辑在原始帖子中改变了太多;帖子的原始含义或意图将丢失。”对不起,我不会想到重构我的代码(使其“最优”)会丢失我答案的含义或意图。除了最初的问题之外,如何uu init_uuu(…)在这里打电话?当试图在一个视图中用answer=answer(question=q,user=request.user)实例化AnswerForm时,a=AnswerPublicForm(instance=answer)实际上会显示所有的答案选项(就像管理员一样),这是因为有一个条件,条件是
self.instance.pk
有一个值,直到<代码>答案
至少保存一次后,才会显示。现在我想了想,这实际上可能不是必需的,所以请尝试删除
if self.instance.pk:
位。最后一步,实际的
问题
属性可能会迫使您需要保存以查找自身。您可以尝试使用
self.instance.question\u id
来过滤
PossibleAnswer