Python Django是否在提交表单时自动为外键赋值?

Python Django是否在提交表单时自动为外键赋值?,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我想在用户提交创建表单时自动将公司名称呈现到数据库中 这是我的模型: class company(models.Model): User = models.ForeignKey(User,related_name="Company_Owner",on_delete=models.CASCADE,null=True,blank=True) Name = models.CharField(max_length=50,blank=False) class group1(models

我想在用户提交创建表单时自动将公司名称呈现到数据库中

这是我的模型:

 class company(models.Model):
    User = models.ForeignKey(User,related_name="Company_Owner",on_delete=models.CASCADE,null=True,blank=True)
    Name = models.CharField(max_length=50,blank=False)

class group1(models.Model):
    User = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    group_Name = models.CharField(max_length=32)
    Company = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Company_group')
这就是我试图在我的视图中执行的操作。py:

class group1CreateView(LoginRequiredMixin,CreateView):
    form_class  = group1Form
    template_name = "accounting_double_entry/group1_form.html"

    def form_valid(self, form):
        form.instance.User = self.request.user
        form.instance.Company = company
        return super(group1CreateView, self).form_valid(form)
但我犯了这个错误:

ValueError: Cannot assign "<class 'company.models.company'>": "group1.Company" must be a "company" instance.
ValueError:无法分配“”:“group1.Company”必须是“Company”实例。
它为用户工作,但不为公司工作

谁能告诉我我在这方面做错了什么


谢谢…

错误可能在这一行

form.instance.Company = company

这里的
公司
看起来像一个
Python类
,它应该是
公司
类的一个实例


因此,将对象/实例用作

company_obj = company.objects.create(.....) # created a ne object
form.instance.Company = company_obj


company_obj = company.objects.get(id=someid) # fetch new object from db
form.instance.Company = company_obj



除此之外,我们建议您在代码/项目中遵循

form.instance.Company = company

这里的
公司
看起来像一个
Python类
,它应该是
公司
类的一个实例


因此,将对象/实例用作

company_obj = company.objects.create(.....) # created a ne object
form.instance.Company = company_obj


company_obj = company.objects.get(id=someid) # fetch new object from db
form.instance.Company = company_obj



除此之外,我们建议您在代码/项目中遵循

而不是
c=company.objects.get(id=1)
使用查询获取所需的公司对象

def form_valid(self, form):
    form.instance.User = self.request.user
    c=company.objects.get(id=1)
    form.instance.Company = c
    return super(group1CreateView, self).form_valid(form)

使用查询获取所需的公司对象,而不是
c=company.objects.get(id=1)

def form_valid(self, form):
    form.instance.User = self.request.user
    c=company.objects.get(id=1)
    form.instance.Company = c
    return super(group1CreateView, self).form_valid(form)

@JPG的回答是正确的。我会详细解释


首先,您将类名命名错误。在python中,类名以大写字母跟随CamelCase。违反此规则会导致类似这样的错误,您会将类名与实例名混淆。

由@JPG给出的答案是正确的。我会详细解释


首先,您将类名命名错误。在python中,类名以大写字母跟随CamelCase。违反此规则将导致如下错误,您会将类名与实例名混淆。

您需要以下内容:

class group1CreateView(LoginRequiredMixin,CreateView):
    form_class  = group1Form
    template_name = "accounting_double_entry/group1_form.html"

    def form_valid(self, form):
        form.instance.User = self.request.user
        # form.instance.Company = company
        form.instance.Company = company.objects.get(pk='something') # OR
        # form.instance.Company = company.objects.create(stuff='stuff')
        return super(group1CreateView, self).form_valid(form)

类名也应该以大写字母(Pascal Case)开头,其属性应该以小写字母(snake_Case)开头。这是一种常见的做法,遵循它以避免混淆

您需要这样的东西:

class group1CreateView(LoginRequiredMixin,CreateView):
    form_class  = group1Form
    template_name = "accounting_double_entry/group1_form.html"

    def form_valid(self, form):
        form.instance.User = self.request.user
        # form.instance.Company = company
        form.instance.Company = company.objects.get(pk='something') # OR
        # form.instance.Company = company.objects.create(stuff='stuff')
        return super(group1CreateView, self).form_valid(form)


类名也应该以大写字母(Pascal Case)开头,其属性应该以小写字母(snake_Case)开头。这是一种常见做法,请遵循它以避免混淆

请共享完整的codeCompany是我在group1模型中给出的字段名称…company是通过外键与group1链接的模型…
form.instance.company=company
,此
公司
来自何处?我已编辑了我的代码…其来自公司模型请共享完整的编码公司是我在group1模型中给出的字段名称…公司是通过外键与group1链接的模型…
form.instance.company=company
,这家公司来自哪里?我已经编辑了我的代码…它来自公司模型不幸的是,我昨天已经建议重命名(但可能在其他一些答案中,),但不幸的是,这个建议没有被考虑。@Wliiem Van Onsem我在我的主要项目中考虑了你的建议…这只是我做的一个实践项目,因为我现在是一名学习者…@Niladrikar:但是上面的经验(两天两个问题)应该会让你得出这样做不好的结论。就像他们说的:“20%的开发时间应该用于重构”。是的,重构需要时间和汗水。但如果不这样做,最终情况只会变得更糟。@Niladrikar你应该这样做,是的,我肯定不会再犯同样的错误,并且已经更新了我的练习代码……谢谢你。不幸的是,我昨天已经建议重命名(但可能在其他一些答案中,),但不幸的是,这个建议没有被考虑。@Wliiem Van Onsem我在我的主要项目中考虑了你的建议…这只是我做的一个实践项目,因为我现在是一名学习者…@Niladrikar:但是上面的经验(两天两个问题)应该会让你得出这样做不好的结论。就像他们说的:“20%的开发时间应该用于重构”。是的,重构需要时间和汗水。但如果不这样做,最终情况只会变得更糟。@NiladryKar你应该这样做,是的,我肯定不会再犯同样的错误,并且已经更新了我的练习代码。……谢谢大家,我可以做这样的事情吗?'c=company.objects.get(pk=self.kwargs['pk')我不这么认为。你应该做的是给用户一个选项,让他们在你的表单中创建或选择公司。是的,我也在考虑这个…谢谢you@VaibhavVishalCan我可以这样做吗?'c=company.objects.get(pk=self.kwargs['pk'])我不这么认为。你应该做的是给用户一个选项,让他们在你的表单中创建或选择公司。是的,我也在考虑这个…谢谢you@Vaibhav不幸的是,我昨天已经建议改名了(但可能在其他一些答案中,),但不幸的是,这个建议没有得到考虑。不幸的是,我昨天已经建议重命名(但可能在其他一些答案中,),但遗憾的是,该建议未被考虑。您需要使用现有公司对象填充公司,还是需要在用户输入公司名称时创建新的公司?您需要使用现有公司对象填充公司,还是需要在用户输入公司名称时创建新的公司?