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)
任何的想法?
您将数据传回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.