0

我是 Django 新手,我对用户帐户(用户名、密码)使用一种表单两次。第一个用户是必需的,第二个用户是可选的。

问题是,复选框也由 required 显示。我可以为视图提供一个参数以避免第一个用户的复选框并将其显示给第二个用户吗?我想做一个案例

那可能吗?我不想仅仅因为一个不同的字段而编写两个具有相同字段的不同类。

我的代码:

视图.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},)

表格.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
#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当它传递给表单类构造函数时完成的。

您也不需要两个单独的模型表单类。您将 key 参数传递给字段构造函数,因此您可以使用相同的表单类,并且只需传入您的可选参数。您会注意到我已将prefix参数添加到表单中以防止字段之间的命名冲突。

于 2013-03-07T12:54:20.903 回答
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 回答
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 允许您从 Model 及其对应的 ModelForm 派生自定义表单。您甚至可以创建不立即验证的表单,但您可以使用它来创建模型对象,以便在进一步活动后保存。具体来说,你可以...

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()

这两个工具,modelform_factory和 的能力form.save(commit=False)通常可以让您避免重新定义标准方法,例如__init__save。当我认为我需要修改这些方法时,我通常会发现,我缺少一些自然内置在 Django 中的功能。

于 2013-03-07T13:32:35.663 回答