【问题标题】:Django: Saving form with User as Foreign keyDjango:使用用户作为外键保存表单
【发布时间】:2014-09-07 17:24:31
【问题描述】:

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

user=User.objects.create_user(username, email, password)

然后把整个user或者user id都放了,也不行,就像这样:

studio_form.user_id=user
studio_form.user_id=user.id

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

所以,这是我的代码:

Django 模型:

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

Django 表单:

from django import forms
from web.models import *

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

Django 视图:

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()

有什么想法吗?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    您在此处将数据传回studio_form

    def studio_register(request):
        # other view code
        studio_form.user_id=user.id
        studio_form.save()
    

    您实际上需要将数据传递给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)
    

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

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

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

    user_id 必须是User 对象(不是user.id),因为它是User model 的外键。因此,一旦您获得了用户对象,只需将您的 Studios 模型中的 user_id 设置为等于 user。然而,更好的命名约定是将字段命名为“用户”(以避免混淆):

    class Studios(models.Model):
            user = models.ForeignKey(User)
    

    确保您也保存 studio_name,因为它是您的 Studios model 中的必填字段。

    【讨论】:

      【解决方案2】:

      我一直在使用 user.groups.add(group) 的其他方式,也许这对你有用?

      【讨论】:

      • 我将用户添加到组的那部分工作完美无缺,但是当我添加 studio_form.user_id=user.id 时什么都不做,只是不保存任何东西,并且 user.id 有 id ,我打印出来
      • studio_formStudios 类型的吗?你也应该可以studio_form.user_id=user
      • No Olly The Ninja,studio_form 是表单 studioForm 的一个实例,它基于模型 Studio。而且我做了studio_form.user_id=user并且不起作用=(,在数据库中保存了除user_id之外的所有内容,为null。
      • 我认为这是因为只保存了实际在 studioForm 中的元素,您可能需要重写创建 Studios 对象的函数并将用户保存在那里...
      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2011-02-24
      • 2012-09-20
      • 2021-09-02
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多