Python 如何使用unique=true to be“创建外键;“可选”;在Django?

Python 如何使用unique=true to be“创建外键;“可选”;在Django?,python,django,django-models,django-views,django-users,Python,Django,Django Models,Django Views,Django Users,我有一个用户模型(由Django预定义)和一个通过ForeignKey连接的UserProfile模型 我正在创建两个单独的模型表单,在一个模板中用作各种注册表单 models.py class UserProfile(models.Model): # This field is required. user = models.ForeignKey(User, unique=True, related_name="connector") location = models

我有一个用户模型(由Django预定义)和一个通过ForeignKey连接的UserProfile模型

我正在创建两个单独的模型表单,在一个模板中用作各种注册表单

models.py

class UserProfile(models.Model):
    # This field is required.
    user = models.ForeignKey(User, unique=True, related_name="connector")
    location = models.CharField(max_length=20, blank=True, null=True)
forms.py

class UserForm(ModelForm):
    class Meta:
        model = User

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
但是,当我加载页面并填写表单信息时,UserProfileForm要求我选择/填写用户字段以进行验证

但是,这个“用户”是目前正在创建的用户,因此我无法选择“用户”,因为它尚未创建/仍在创建中

我知道这个user is字段具有unique=true属性,但是有没有办法使这个字段成为“可选”字段

我的视图(下面)应该处理它,这样一旦创建了用户对象,我就会将UserProfile的外键设置为这个新创建的用户对象(除非我也做了一些错误的事情My views.py)

views.py

@csrf_protect
def register(request):
    if request.method == 'POST':
        form1 = UserForm(request.POST)
        form2 = UserProfileForm(request.POST)
        if form1.is_valid() and form2.is_valid():
            #create initial entry for user
            username = form1.cleaned_data["username"]
            password = form1.cleaned_data["password"]
            new_user = User.objects.create_user(username, password)
            new_user.save()

            #create entry for UserProfile (extension of new_user object)      
            profile = form2.save(commit = False)
            profile.user = new_user
            profile.save()
            return HttpResponseRedirect("/books/")
    else:
        form1 = UserForm()
        form2 = UserProfileForm()
    c = {
        'form1':form1,
        'form2':form2,
    }
    c.update(csrf(request))
    return render_to_response("registration/register.html", c)

只需从表单中排除该字段

class UserProfileForm(ModelForm):
  class Meta:
    model = UserProfile
    exclude = ('user',)
你可以设置:

user = models.ForeignKey(User, unique=True, blank=True, null=True, related_name="connector")
这将使用户关系成为可选的,但我认为这不是您需要的。相反,为什么不从
UserProfile
表单中删除
user
字段并手动分配它,而不让用户看到下拉列表呢。这样就不会有验证错误

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ("user", )