【发布时间】:2022-11-10 05:06:55
【问题描述】:
我已经在这个问题上旋转了一两天。我有 3 个模型的 django Web 应用程序
用户/模型.py:
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
# Create your models here.
class ExtendedUser(models.Model):
user=models.OneToOneField(User,null=True, on_delete=models.CASCADE)
def full_name(self):
return (self.user.get_full_name())
def __str__(self):
return self.user.get_full_name()
@receiver(post_save, sender=User)
def create_or_update_user_extendeduser(sender, instance, created, **kwargs):
if created:
ExtendedUser.objects.create(user=instance)
instance.extendeduser.save()
游乐场/models.py:
class Customer(models.Model):
def __str__(self):
return self.Customer_Name
Customer_Name = models.CharField(max_length=100)
SFDC_Customer_Record_Number = models.IntegerField(default='')
Zone = models.CharField(max_length=50, default='')
Government = models.BooleanField(default=False)
date_posted = models.DateTimeField(default=timezone.now)
customerauthor = models.ForeignKey(ExtendedUser, on_delete=models.DO_NOTHING,default=ExtendedUser)
def get_absolute_url(self):
return reverse('playground-home')
class Vue_Quote(models.Model):
def __str__(self):
return self.Quote_Name
Quote_Name = models.CharField(max_length=100)
SFDC_Golden_Opp_ID = models.IntegerField()
Vue_System_Count = models.IntegerField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(ExtendedUser, on_delete=models.DO_NOTHING,default=ExtendedUser,blank=True,null=True)
Quote_Type = models.CharField(max_length=100)
Customer = models.ForeignKey(Customer, on_delete=models.DO_NOTHING, default='')
def get_absolute_url(self):
return reverse('quote-detail',kwargs={'pk': self.pk})
我正在使用 3rd 方应用程序 django-extra-views 创建一个表单,该表单允许用户同时创建客户和报价。视图.py:
class QuoteInline(InlineFormSetFactory):
model = Vue_Quote
fields = ['Quote_Name','SFDC_Golden_Opp_ID','Vue_System_Count','Quote_Type',]
factory_kwargs = {'extra':1}
class CreateQuoteInlinesView(CreateWithInlinesView):
model = Customer
inlines = [QuoteInline]
fields = ['Customer_Name','SFDC_Customer_Record_Number','Zone','Government']
template_name= 'quote_and_customer.html'
def forms_valid(self, form, inlines):
form.instance.customerauthor = ExtendedUser.objects.get(user=self.request.user)
return super().forms_valid(form,inlines)
所有这一切都很好,除了我无法为 Vue_Quote 模型保存作者......我总是得到“无”:
Image of Vue_Quote.author = None from my form
我尝试了多种解决方案,但似乎无法解决这个问题,而且我在 django-extra-views 上找到的文档很少,以支持我找到解决方案。
非常感谢任何帮助!
【问题讨论】:
-
customer字段是否在报价行内?- 如果是这样,您可以通过添加forms_valid来从该字段中获取它报价行内并做form.instance.author = form.instance.Customer.customerauthor(类似于你用CreateQuoteInlinesView)我从来没有使用过这个插件所以只是抛出一个想法 -
@nealium 这是我的 QuoteInLine 代码: class QuoteInline(LoginRequiredMixin,InlineFormSetFactory): model = Vue_Quote fields = ['Quote_Name','SFDC_Golden_Opp_ID','Vue_System_Count','Quote_Type',] factory_kwargs = {'extra':1}不,这里没有设置客户。不知道我会在哪里设置它。
-
def forms_valid(self, form, inlines): self. Object = form. Save(commit=False) self.object.customerauthor = ExtendedUser.objects.get(user=self.request.user) form. Save(commit=True) for formset in inlines: formset.save(commit=False) #print(ExtendedUser.objects.get(user=self.request.user)) formset.author = ExtendedUser.objects.get(user=self.request.user) print("here comes the author") print(formset.author) formset.save() return HttpResponseRedirect(self.get_success_url()) -
我尝试了上述...我的打印语句从我的自定义用户模型中为我提供了正确的名称输出,但它仍然没有保存到数据库中......
标签: python django django-class-based-views