【发布时间】:2020-12-29 17:39:05
【问题描述】:
我正在创建一份问卷/调查,并在同一模型上构建了两个表单(模型表单)。这些表单在单独的视图上调用,但在保存时,它们在数据库中显示为单独的用户。我不确定如何让它们保存为同一个用户,我已经在使用'post = form.save(commit=False), post.user = request.user, post.save()' 方法来保存表格。
编辑:添加以尝试保存到同一实例
型号:
class QuizTakers(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
industry_choices = (
(1, 'Service'),
(2, 'Hospitality'),
(3, 'Wholesale/Retail'),
(4, 'Manufacturing'),
(5, 'Agriculture')
)
industry = MultiSelectField(choices=industry_choices, max_length=1, max_choices=1)
company_name = models.CharField( max_length=100)
email = models.EmailField(blank=True)
score = models.FloatField(default=0)
completed = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.company_name
表格:
# Form for getting company name
class QuizTakerForm(forms.ModelForm):
class Meta:
model = QuizTakers
fields = ['company_name']
# Form for getting company industry
class QTIndustryForm(forms.ModelForm):
class Meta:
model = QuizTakers
fields = ['industry']
观看次数:
# view for getting company name
def start(request):
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = QuizTakerForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
request.session['company_name'] = form.cleaned_data['company_name']
post = form.save(commit=False)
post.user = request.user
post.save()
# redirect to a new URL:
return HttpResponseRedirect('industry/')
# if a GET (or any other method) we'll create a blank form
else:
form = QuizTakerForm()
return render(request, 'ImpactCheck/start.html', {'form': form})
# view for getting industry
class IndustryView(FormView):
template_name = 'ImpactCheck/industry.html'
form_class = QTIndustryForm
success_url = '1/'
def get(self, request):
company_name = request.session['company_name']
this_user=QuizTakers.objects.filter(company_name=company_name).order_by('-timestamp').first()
form=self.form_class(instance=this_user)
company_name = request.session['company_name']
return render(request, 'ImpactCheck/industry.html', {'form': form, 'company_name': company_name})
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
post = form.save(commit=False)
post.user = self.request.user
post.save()
return HttpResponseRedirect('/1')
【问题讨论】:
-
当你说这些表格在不同的视图上调用时,你知道它们的填写顺序是什么吗?如果您在不同的视图中拥有这些表单,则其中一个必须负责创建对象,另一个必须负责更新存储的对象。
-
嗨@AkshathMahajan,感谢您的评论!首先调用公司名称视图。通过对象,您是指模型中的字段吗?每个表单都调用模型中的不同字段,并且都保存创建的表单。在调用 post.save() 之前,我尝试使用“post.user = request.user”将两者联系在一起
-
您应该查看 django 中的表单实例,这样您就可以在公司名称视图中创建对象,然后在下一个视图中更新该对象。通过对象,我的意思是数据库中的一行
-
我添加了尝试保存到同一个实例,方法是过滤具有相同公司名称和最新时间戳的实例,然后在调用表单时添加该实例过滤器。视图正在工作,但仍未保存到同一实例。
标签: django django-forms