Django:使用用户作为外键保存表单

Osc*_*llo 5 python django django-models django-forms

我有一个问题,我正在寻找一个星期前的答案,但没有找到。我想保存一个模型,使用 Django 用户作为外键,我尝试创建一个这样的新用户:

user=User.objects.create_user(username, email, password)
Run Code Online (Sandbox Code Playgroud)

然后把整个用户或者用户id都放上去就不行了,就像这样:

studio_form.user_id=user
studio_form.user_id=user.id
Run Code Online (Sandbox Code Playgroud)

什么都没有发生,一切都保存在数据库中,用户,组,但不是用户作为外键,外键user_id每次都是空的,请帮忙。

所以,这是我的代码:

姜戈模型:

from django.contrib.auth.models import User
class Studios(models.Model):
    user_id=models.ForeignKey(User)
    studio_name=models.CharField(max_length=250)
Run Code Online (Sandbox Code Playgroud)

Django 表单:

from django import forms
from web.models import *

class studioForm(forms.ModelForm):
    class Meta:
        model = Studios
        exclude=('user_id')
        widgets = {
            'password': forms.PasswordInput(),
        }
Run Code Online (Sandbox Code Playgroud)

姜戈视图:

def studio_register(request):
    if request.method == "POST":
        studio_form=studioForm(request.POST, request.FILES)
        if studio_form.is_valid():
            studio_form.save(commit=False)
            data=request.POST
            username=data.get("user_name")
            email=data.get("email")
            password=data.get("password")
            user=User.objects.create_user(username, email, password)
            group=Group.objects.get(name='studio')
            group.user_set.add(user)
            studio_form.user_id=user.id
            studio_form.save()
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Aar*_*ier 5

您将数据传回studio_form此处:

def studio_register(request):
    # other view code
    studio_form.user_id=user.id
    studio_form.save()
Run Code Online (Sandbox Code Playgroud)

您实际上需要将数据传递给Studios模型才能将其保存到数据库中。该Form只清洗数据和临时支撑它,直到你访问模型中的数据保存到数据库。

因此,如果您是模型

from django.contrib.auth.models import User
class Studios(models.Model):
    user_id=models.ForeignKey(User)
    studio_name=models.CharField(max_length=250)
Run Code Online (Sandbox Code Playgroud)

您需要在您的视图中访问它:

def studio_register(request):
    # other view code
    studio = Studios.objects.create(user_id=user, studio_name=name)
Run Code Online (Sandbox Code Playgroud)

这将创建一个Studios对象,将数据保存到数据库中。

user_id需要是一个User对象(不是user.id),因为它是User model. 所以,一旦你的用户对象,则只需设置user_id你的Studios模型等于user。但是,更好的命名约定是将字段命名为“user”(以避免混淆):

class Studios(models.Model):
        user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

确保您也保存studio_name,因为它是您的Studios model.