2016-05-29 4 views
1

私は、ユーザープロファイル(ユーザーは複数の選択肢を関連付けることができます)に関連付けたい、ModelChoiceFieldという1つのフィールドのみを含むモデルをアプリケーションに持っています。これらの選択肢は実行中は変更されません。最終的にはそれらを使用してユーザーを選択してフィルタリングします。 2つのモデルの外観は次のとおりです。ModelChoiceFieldでモデルをインスタンス化する

... 
class Choice(models.Model): 
    Choice1 = 0 
    Choice2 = 1 
    Choice3 = 2 
    Choices_Available = (
      (Choice1, 'Choice1'), 
      (Choice2, 'Choice2'), 
      (Choice3, 'Choice3'), 
    ) 
    choice = models.IntegerField(choices=Choices_Available, null=True) 

    def __iter__(self): 
     return iter(self.Choices_Available) 

    def __str__(self): 
     return self.Choices_Available[self.choice] 

class Profile(models.Model): 
    choice = models.ManyToManyField(Choice) 

私が抱えている問題は、実際に選択肢を選択し、その選択肢をユーザーに関連付けることです。

... 
class EditProfile(forms.ModelForm): 
    choice = forms.MultipleChoiceField(choices=Choice.objects.all(), widget=CheckboxSelectMultiple) 
    class Meta: 
     model = Profile 
     fields = ['choice'] 

特定のセットアップには現在の選択オブジェクトが存在しないので、何も現れないことを意味し:実際に選択をするだろうユーザーフォームでは、ほとんどの例では、私を濾過可能な選択肢のオブジェクトと、なMultipleChoiceFieldを見てきました。

私は、利用可能な選択肢ごとに選択肢オブジェクトを作成することでそれを修正すると思います。ユーザーがフォームのあるページを要求すると、使用可能な選択肢が表示されます。結局、すべてのユーザーは多くの選択肢オブジェクト(この例では3)に関連付けることができ、使用されるスペースを最小限に抑えるだけの多くのオブジェクトがデータベースに格納されます。

これを行うには、私はChoiceオブジェクトを作成する必要があります。私の質問には、次のことがあります。選択肢を選択してChoiceオブジェクトを作成するにはどうすればいいですか(現在デフォルトののinitメソッドしかありません)。また、これは合理的な方法ですか? ありがとう

答えて

0

同じことが不思議な人には、私が見つけたものを教えてください。プログラムで行うことができます選択に対応する番号を、変更もちろん

Choice.objects.create(choice=0) 

:選択肢を指定してオブジェクトをインスタンス化する 。

また、私はフォームに間違いがありました。 MultipleChoiceFieldは、一連のオプションから選択するためのものです。 ModelChoiceFieldは非常に似ていますが、オブジェクトのクエリーセットを取り込み、それらのオブジェクトから選択することができます。これは、私の例のように、多対多のフィールドに必要な機能です。

関連する問題