2016-04-01 12 views
1

私はlanguage_tuples = models.ManyToManyField(LanguageTuple)を私のUserProfileに定義しました。このフィールドは、通常のユーザーが翻訳者になりたいときに入力する必要があります。だから彼は言語の必要な数だけ言語の組み合わせを選ぶことができるはずです。Django - ManyToManyFieldはフォームに表示されません

編集:Shang Wangのおかげで、複数のLanguageTuplesを選択できますが、フォーム内に新しいLanguageTupleオブジェクトを作成することができません。

class Language(models.Model): 
    shortcut = models.CharField(max_length=40) 
    name = models.CharField(max_length=40) 

    def __str__(self): 
     return self.name 


class LanguageTuple(models.Model): 
    language_from = models.ForeignKey(Language, related_name='language_from', null=True) 
    language_to = models.ForeignKey(Language, related_name='language_to', null=True) 

    def __str__(self): 
     return '{} to {}'.format(self.language_from, self.language_to) 

それでは、複数のLanguage既にデータベース内のオブジェクトが、LanguageTupleのインスタンスがあると仮定しましょう。私はuserが彼自身のタプルを(彼が望む数だけ)ビルドできるようにしたい。 CZ、EN、GE、SKなどの言語があれば、CZ-EN、EN-CZ、GE-CZ、SK-GEなどのタプルを作成できます。タプルを選択すると、データベース内にタプルが作成されます通常のようにLanguageTupleインスタンスが存在しません。

問題は、フォームがレンダリングされるときにフォーム内にフィールドが存在しないことです。あなたはそれをどうすればいいのかわかりません。ご覧のとおり、フィールドにlanguage_tuplesというフィールドを追加しました。あなたがTranslatorRegistrationFormためforms.ModelFormを必要と私はすでにコメントで言及した

class TranslatorRegistrationForm(forms.Form): 
    IBAN = forms.CharField(max_length=40,required=True) 
    first_name = forms.CharField(max_length=40,required=True) 
    last_name = forms.CharField(max_length=40,required=True) 


    class Meta: 
     model = UserProfile 
     fields = (
     'first_name','last_name','IBAN','language_tuples' 
     ) 
+1

私は 'TranslatorRegistrationForm'は' forms.Form'ではなく 'forms.ModelForm'でなければならないと思います。 –

+0

ああ、ありがとう、それは助けた。しかし今、私は言語タプルから選択できますが、言語タプルから言語タプルになることはできません。何かヒントはありますか? –

答えて

2

一つの問題は、そうでない場合Djangoは表示したいすべてのフィールドを認識しません。

から選択して新しいペアを作成する場合は、2つのフォームになります。 1つは既存のフォーム用、もう1つはモデルLanguageTuple用のフォームです。あなたはテンプレートに両方のフォームを表示する必要がありますので、人々はリストlanguage_tuplesから選択するか、LanguageTupleのフォームに記入してください。

ユーザーが既存のlanguage_tupleを選択したかどうか、または新しく作成したLanguageTupleを使用するかどうかを検出するロジックが必要であることに注意してください。すべてをデータベースに保存する前に、いくつかの追加ステップが必要ですが、それは簡単です。

関連する問題