在django中渲染表单时检索数据

时间:2016-04-19 04:50:19

标签: django

我有一个带有一些字段的表单。我希望显示除​​两个以外的所有字段。但是,需要显示一个现场数据。 我能够获取表单但无法从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}}

3 个答案:

答案 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()类型。