我有一个带有一些字段的表单。我希望显示除两个以外的所有字段。但是,需要显示一个现场数据。 我能够获取表单但无法从DB中检索数据以进行显示。
Model.py
class companyeditform(forms.ModelForm):
class Meta:
model=Company
exclude = ('user','company_name',)
forms.py
@login_required
def companyadd(request):
if request.method == 'POST':
company_form=companyeditform(instance=request.user.company,data=request.POST)
if company_form.is_valid():
new_form=company_form.save(commit=False)
new_form.save()
return render(request,'account/dashboard.html',{'section':'addcompany'})
else:
company_form=companyeditform(instance=request.user.company)
company_details=Company.objects.get(user=request.user.company)
return render(request,'account/company.html',{'company_form':company_form})
views.py
company_details=Company.objects.get(user=request.user.company)
显示表单时,一切都按计划运行。但是没有获得company_name。 使用此查询获取公司名称。
Cannot query "self.user.company_name": Must be "User" instance.
Django给出以下错误:
{{1}}
答案 0 :(得分:3)
在此查询company_details=Company.objects.get(user=request.user.company)
中,您试图获取特定用户的公司。但是在声明中,您正在比较user=request.user.company
,两者都是两种不同的类型(User是authuser模型,request.user.company是Company模型)。您无法在查询中执行此操作。
company_details=Company.objects.get(user=request.user)
此声明将解决此问题。你也可以做到
company_details=request.user.company
因为该关联是OneToOne。
答案 1 :(得分:2)
您收到该错误的原因是,您试图通过将公司过滤掉与当前用户匹配的公司来获取公司,但是您传递的是实际的公司对象:
company_details=Company.objects.get(user=request.user.company)
# ^^^^^^^
您可以通过以下方式修复该行:
company_details=Company.objects.get(user=request.user)
但是您已经拥有了正确的对象,在request.user.company
中,您不需要再次获取它,只需:
company_details = request.user.company
print(company_details.company_name)
事实上,由于您使用的是render
快捷方式,因此您甚至不需要执行此步骤,因为请求对象将在您的模板中提供,因此您只需要做的就是:
Company: {{ request.user.company.company_name }}
最后,您应该始终在POST请求后重定向(请参阅this article on wikipedia for the details)。
答案 2 :(得分:1)
request.user
可能是AnonymousUser
类。进行一些额外处理以确保request.user
提供django.contrib.auth.get_user_model()
类型。