Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:创建具有关系的表单_Django_Forms_Relationship_Formset - Fatal编程技术网

Django:创建具有关系的表单

Django:创建具有关系的表单,django,forms,relationship,formset,Django,Forms,Relationship,Formset,我准备了一个有关系的模型。 我想得到一个表单,它可以为该表单创建用户 有人能告诉我怎么解决吗 class UserProfile(models.Model): user = models.OneToOneField(User, unique=True, primary_key=True) website = models.URLField(null=True, blank=True) accepted_rules = models.BooleanField(default

我准备了一个有关系的模型。 我想得到一个表单,它可以为该表单创建用户

有人能告诉我怎么解决吗

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True, primary_key=True)
    website = models.URLField(null=True, blank=True)
    accepted_rules = models.BooleanField(default=False)
    accepted_rules_date = models.DateTimeField(auto_now_add=True)


class UserProfile(ModelForm):
    class Meta:
        model = UserProfile

@csrf_protect
def register(request):
    if request.method == "POST":

        form = UserProfile(request.POST or None)
        if form.is_valid():
            website = form.cleaned_data['website']
            accepted_rules = form.cleaned_data['accepted_rules']

            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']



            form.save()


            print "All Correct"            


    return TemplateResponse(request, 'base.html', {
                             'form':form,
                             }
                            )

这是我考虑的一种方式。首先,我将表单命名为UserProfileForm,这样它的名称就不会与模型冲突。为创建新用户所需的字段向UserProfile表单添加额外字段。创建新的用户实例。使用form.save(commit=False),以便可以将新创建的用户实例添加到UserProfile实例并保存它。也许还有更优雅的方式

from django import forms

class UserProfileForm(forms.ModelForm):

    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput())
    email = forms.EmailField()

    class Meta:
        model = UserProfile

from django.contrib.auth.models import User

@csrf_protect
def register(request):
    if request.method == "POST":
        form = UserProfileForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            user = User(username=username, email=email)
            user.set_password(password)
            user.save()
            user_profile = form.save(commit=False)
            user_profile.user = user
            user_profile.save()
            print "All Correct"            
return TemplateResponse(request, 'base.html', {'form':form})

请注意
用户(用户名、密码、电子邮件)
用法不正确。您需要传递名为参数的模型类,例如
username=username
才能工作:通常
pk
是构造函数的第一个参数,因此您实际上会将User()w/
pk
设置为username。此外,参考文献,不要使用
password=…
,这是在您的代码中隐式完成的,用于
User
构造。@okm,绝对正确。我混用了
User.objects.create_User()
,但仍然有错误的参数顺序,并在上面进行了编辑以反映正确的密码设置。是否应该在视图中处理关系?将所有这些封装在表单中似乎更符合逻辑。我没有看到太多关于它的文档,我想。。。