0

私はDjangoを初めて使用し、ユーザーアカウント(ユーザー名、パスワード)に1つのフォームを2回使用します。最初のユーザーが必要ですが、2番目のユーザーが代わりに必要です。

問題は、チェックボックスが必須によっても表示されることです。最初のユーザーによるチェックボックスを回避して2番目のユーザーに表示するために、ビューに引数を指定できますか?私は次のようなケースをやりたい

それは可能ですか?1つの異なるフィールドがあるという理由だけで、同じフィールドで2つの異なるクラスを作成したくありません。

私のコード:

views.py

if request.method == "POST":
    admin_form = MysqlDatabaseForm_user(request.POST or None, given_argument='admin')
    user_form = MysqlDatabaseForm_user(request.POST or None, given_argument='extra_user')

    if admin_form.is_valid():
            #do something
    if user_form.is_valid():
            #do something


else:
    admin_form = MysqlDatabaseForm_user()
    user_form = MysqlDatabaseForm_user()

return TemplateResponse(request, "services/database/add_service_database.html", {'admin_form': admin_form,
                                                                                 'user_form': user_form},)

forms.py

class MysqlDatabaseForm_user(forms.ModelForm):
class Meta:
    model = MysqlUser

def __init__(self, *args, **kwargs):
    given_argument = kwargs.pop('given_argument', None)
    super(MysqlDatabaseForm_user, self).__init__(*args, **kwargs)

    if given_argument == 'extra_user':
        self.fields['extra_user'] = forms.BooleanField(required=False)
    else:
        self.fields[given_argument] = forms.BooleanField(required=False)

else-caseは、「given_argument」にあるスクリーニング用です。空のようです

4

3 に答える 3

1
class MysqlDatabaseForm_user(forms.ModelForm):
    class Meta:
        model = MysqlUser

    def __init__(self, given_argument, *args, **kwargs):
        super(MysqlDatabaseForm_user, self).__init__(*args, **kwargs)

        if given_argument == 'extra_user':
            self.fields['extra_user'] = forms.BooleanField(required=False)



def view(request):
    if request.method == 'POST':
        admin_form = MysqlDatabaseForm_user(request.POST, given_argument='admin') 
        user_form = MysqlDatabaseForm_user(request.POST, given_argument='extra_user')
        ...........
    else:
        admin_form = MysqlDatabaseForm_user(given_argument='admin') 
        user_form = MysqlDatabaseForm_user(given_argument='extra_user')

    return render(request, 'page.html', {
        'admin_form': admin_form,
        'user_form': user_form,
    })
于 2013-03-07T13:28:32.530 に答える
1
#forms.py
class UserForm(forms.ModelForm):
    username = forms.CharField(max_length=255)

    def __init__(self, *args, **kwargs):
        given_argument = kwargs.pop('given_argument', None)
        super(UserForm, self).__init__(*args, **kwargs)

        if given_argument:
            if given_argument == 'extra_user':
                key = 'extra_user'
            else:
                key = given_argument.lower()
            self.fields[key] = forms.BooleanField(required=False)

#views.py
def your_view(request):
    user_form = UserForm(request.POST or None, given_argument='extra_user',
        prefix='user')
    admin_form = UserForm(request.POST, given_argument='admin', prefix='admin')
    ...

#template.html
<form action="." method="post" enctype="[the enctype you need]">
    <ol>
        <li>User Form</li>
        {{ user_form.as_ul }}
    </ol>

    <ol>
        <li>Admin Form</li>
        {{ admin_form.as_ul }}
    </ol>

    <input type="submit" value="Submit" />
</form>

のオーバーライドを行い、クラスを呼び出す前に__init__余分な引数を から取り出します。これにより、引数を渡し、フォーム クラスが通常期待するからそれを削除し、残りの を渡すことができます。**kwargssuper()**kwargs**kwargs

渡す引数からフィールドのキーを割り当てる場合は、渡す値に注意する必要があります。特殊文字、スペースなどは使用できません。

GET リクエストの場合、フォームをインスタンス化するための別の条件は必要ありませんrequest.POST or None。これは、フォーム クラス コンストラクターに渡されるときに実行されます。

また、2 つの別個のモデル フォーム クラスも必要ありません。キー引数をフィールド コンストラクターに渡すので、同じフォーム クラスを使用して、オプションの引数を渡すだけです。prefixフィールド間の名前の競合を防ぐために、フォームに引数を追加したことに気付くでしょう。

于 2013-03-07T12:54:20.903 に答える
0

modelform_factory を使用して、コード ロールを独自のフォームにします。(このような単純な例では、これもハンド コーディングできます。ハンド コーディングの良い例については、以下の Catherine の例を参照してください。)

どうですか:

from django.forms.models import modelform_factory
form_fields = ['extra_user'] if given_argument == 'extra_user' else []
user_form = modelform_factory(Model, form=MysqlDatabaseForm_user, fields=form_fields)

user_form.is_valid()extra_userフィールドがrequired=False

Django では、モデルとその対応する ModelForm からカスタム フォームを派生させることができます。すぐに検証されないフォームを作成することもできますが、これを使用して、さらにアクティビティを行った後に保存される Model オブジェクトを作成できます。具体的には、次のことができます...

if request.Post:
  form = user_form(request.POST)
  model_object = form.save(commit=False) # now you have an model instance, and no longer need the form
  model_object = process_object(model_object)
  model_object.save()

これら 2 つのツール、modelform_factory、および の機能により、通常、やform.save(commit=False)などの標準メソッドの再定義を回避できます。通常、これらのメソッドを変更する必要があると思うと、Django に自然に組み込まれているいくつかの機能が不足していることに気付きます。__init__save

于 2013-03-07T13:32:35.663 に答える