2011-06-23 13 views
4

私が使用するコードは次のとおりです。実行時にdjangoフォームを変更する最も良い方法は何ですか?

class VoteForm(forms.ModelForm): 
    other_choice1 = forms.BooleanField(required=False) 
    other_choice2 = forms.BooleanField(required=False) 
    other_choice3 = forms.BooleanField(required=False) 
    other_choice4 = forms.BooleanField(required=False) 

    class Meta: 
     model = Vote 
     exclude = ('choice', 'other_choices',) 

    def __init__(self, poll_id, *args, **kwargs): 
     super(VoteForm, self).__init__(*args, **kwargs) 
     p = get_object_or_404(Poll, pk=poll_id) 
     choices = p.choice_set.all() 
     choices_len = len(choices) 
     f = ['other_choice1','other_choice2','other_choice3','other_choice4'] 
     for i in range(0,choices_len): 
      self.fields[f[i]].label = str(choices[i]) 
     for i in range(choices_len,4): 
      del self.fields[f[i]] 

これは、私は、実行時にフォームのフィールドを変更するために見つけた最良の方法です。実装をハッキングしたような感じです。それを行うための明確な方法は何ですか?

おかげで、 アレックス

+1

私は、Django IRCチャンネルにかなりの数の有能な開発者がいることを発見しました。あなたがまだ持っていない場合は、このページのURLを渡すことをお勧めします。 –

+0

何をしようとしていますか?そのコードで見るのは難しいです。投票と投票のモデルを投稿できますか? –

+0

@Doc、あなたはIRCチャンネルのシリングをやめますか? Stackoverflowには、かなりの数の有能なDjango開発者がいます。 –

答えて

4

使用base_fieldsMonkey patching a Django form class?で説明したように:

ContactForm.another_field = forms.CharField(...) 
ContactForm.base_fields['another_field'] = ContactForm.another_field 

(またはBaseFormここhttp://snipt.net/danfreak/how-to-generate-a-dynamic-at-runtime-form-in-django/を説明したように:

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
       'email': forms.EmailField(), 
       'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated: 
     fields['captcha'] = CaptchaField() 
    return type('ContactForm', [forms.BaseForm], { 'base_fields': fields }) 

) 
+0

これを普通のフォームではなく、ModelFormにどのように適応させますか? –

+0

フォームの 'save()'メソッドをオーバーライドして、カスタムフィールドを処理します。 – Udi

+0

しかし、おそらくあなたの問題を解決するためのより良い方法があります。 **新しい質問**にあなたのモデルとあなたのフォームの要件を貼り付けると、より多くの助けが得られます。 – Udi

1

はい、これはハック思えんが。その理由は、あなたが間違った方向に考えているということです。リレーションシップ内の各アイテムに対して1つのチェックボックスを使用し、項目ごとに1つのBooleanFieldを設定することでそれを実装しようとしています。しかし、それはあなたが考えているべきではありません - あなたは、その関係の中のアイテムを表すために単一のフィールドを考えなければならないし、実際にチェックボックスを表示するChecbkoxMultipleSelectウィジェット。

+0

あなたは説明したり、例を挙げることができますか?私はまったくあなたに従わない。 –

関連する問題