Python 如何将HTML中的布尔字段输入到Django模型中?

Python 如何将HTML中的布尔字段输入到Django模型中?,python,django,django-models,django-views,django-forms,Python,Django,Django Models,Django Views,Django Forms,我使用Django表单创建用户,并通过添加布尔字段扩展了默认用户模型,因此为其定义了一个新表单。但我无法将HTML表单中的输入输入到这个布尔字段。我要更改我的HTML表单代码吗? 以下是我的代码示例: models.py # accounts.models.py from django.db import models from django.contrib.auth.models import User class SpecialUser(models.Model): user =

我使用Django表单创建用户,并通过添加布尔字段扩展了默认用户模型,因此为其定义了一个新表单。但我无法将HTML表单中的输入输入到这个布尔字段。我要更改我的HTML表单代码吗? 以下是我的代码示例:

models.py

# accounts.models.py
from django.db import models
from django.contrib.auth.models import User


class SpecialUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    flag = models.BooleanField()

    def __str__(self):
        return self.title

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.forms.widgets import CheckboxInput
from .models import SpecialUser

class RegisterForm(UserCreationForm):
    email = forms.EmailField()
    class Meta:
        model = User
        fields = ["username", "email", "password1", "password2"]

class SuperUserForm(forms.ModelForm):
    class Meta:
        model = SpecialUser
        fields = ['flag']
        widgets = {
            'flag': CheckboxInput(attrs={'class': 'flag'}),
        }
views.py

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        sp_form = SuperUserForm(request.POST)
        if form.is_valid() and sp_form.is_valid():
            user = form.save()
            sp_form = sp_form.save(commit=False)
            sp_form.user = user
            sp_form.save()
            messages.success(request, 'Account created!')
            return redirect('login')
    else:
        form = RegisterForm()
        sp_form = SuperUserForm()
        messages.warning(request, 'Your account cannot be created.')
    return render(request, 'register.html', {'form': form})
HTML表单代码:

<form method="post" class="form-group">
    {% csrf_token %}
    {{ form|crispy }}
    <label for="flag">Special User: </label>
    <input id="flag" class="flag" type="checkbox" name="flag">
    <button type="submit" class="btn btn-success">Sign up</button>
</form>

{%csrf_令牌%}
{{form | crispy}}
特殊用户:
注册

对于初学者来说,这通常不是您希望在Django应用程序中扩展用户模型的方式。您可能希望从AbstractUser继承并将字段添加到该模型中,然后运行迁移。至少在这种情况下,这是理想的,然后您可以简单地在RegisterForm.fields上定义字段,并让
{{form | crispy}}
为您呈现表单。当然,你可以调用
form.save()
,继续你的生活


为了说明这可能不起作用的原因,除非绝对必要,否则为表单呈现自己的字段通常不是一种好的做法。如果您坚持这样做,请注意Django会在id前面加上
id\uu
,因此在您的情况下,它将是视图中的
..

通过将
sp_form
添加到传递到
render()
的上下文dict中,可以将其加载到上下文数据中。这将允许模板查看变量。例如:

    return render(request, 'register.html', {'form': form, 'sp_form': sp_form})
然后可以在模板中渲染它。例如,在主窗体下面:

{{ form|crispy }}
{{ sp_form|crispy }}

非常感谢。问题解决了。但是如何在HTML文件中呈现SpecialsPerform属性呢?就像我使用
{{user.username}}
获取用户名一样。但是
{{user.phonenumber}
不起作用(这是第二个表单的属性)。请帮我做这个!谢谢你分享你的知识!我是个十足的初学者。我试着做实习工作。你能给我推荐一些与Django搭配的书吗?两勺Django是一个很棒的系列。似乎是来自可靠来源的可靠帖子。祝你在冒险中好运,我的朋友。不断地打破东西,让它们变得更好,确保你在做的时候玩得开心。干杯