0

各ユーザーが回答できる、個別の回答を含む一連の質問を作成しようとしています。この種の機能を実現するために、次のモデルを作成しました。

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-interface で十分です。「質問ごと」に表示される必要があるため、「質問」には、許可されている回答と、ユーザーが提供できる回答が表示される必要があります。

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 を生成する回答を保存するまで、すべてがうまく機能します。これはオブジェクト間の依存関係に関連していると思いますか?

回避できなかった2番目の項目: 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 を発生させます

どんなポインタでも大歓迎です。

一番、

アンドレアス

4

2 に答える 2

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()
于 2012-08-01T19:26:49.613 に答える
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
于 2012-08-01T19:54:32.217 に答える