Django:渲染TemplateView Form后无法访问OneToOneField

时间:2018-03-19 08:29:50

标签: python django django-models django-forms

我是Django的新手,并且不明白究竟是什么导致了这一点:

我有一个模型公司,它有一个OneToOneField,创建者。

# models.py
class Company(models.Model):
    class Meta:
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'
    creator = models.OneToOneField(User, related_name="company", on_delete=models.CASCADE, unique=False, null=True)
    name = models.CharField(max_length=50)

我有一个TemplateView类来处理创建公司模型的get和post请求:

# views.py
class create_company(TemplateView):
    def get(self, request):
        form = CompanyCreateForm()    
        title = "Some form"    
        return render(request, "form.html", {"form": form, "title": title})

    def post(self, request):
        form = CompanyCreateForm(request.POST)

        if form.is_valid():
            comp = form.save(commit=False)
            comp.creator = request.user      
            comp.save()
            return redirect('index')

表单正确显示,我提交时存储的问题是我使用的base.html,我显示{%user.company%};表单模板扩展如下:

{% extends "account/base.html" %}
{% load crispy_forms_tags %}

{% block content %}
<div class="container">
<form method="post" action="">
    {% csrf_token %}
    {{form|crispy}}
    <button class="btn btn-success" type="submit">Save</button>
</form>
<br>
</div>
<br>
{% endblock %}

并在base.html中访问

{% if user.is_authenticated %}
    {% user.company %}
{% endif %}

但即使设置了user.company也没有显示;它仅在我重定向到索引时显示,但在我呈现表单时不显示。

有人可以帮助我了解导致这种情况的原因吗?

2 个答案:

答案 0 :(得分:1)

{% if request.user.is_authenticated %}
    {% request.user.company %}
{% endif %}

您没有向base.html发送任何上下文,因此只有user无效。

答案 1 :(得分:0)

当我模拟你的代码时,这是错误。

Error during template rendering

In template /home/user/django/drf_tutorial/snippets/templates/base.html, error at line 2
Invalid block tag on line 2: 'user.company', expected 'elif', 'else' or 'endif'. Did you forget to register or load this tag?
1   {% if user.is_authenticated %}
2       {% user.company %}
3   {% endif %}
4   {% block content %}{% endblock %}

它提示显示公司的代码应该是变量{{ }}而不是标记{% %}。因此base.html模板应如下所示。

{% if user.is_authenticated %}
    {{ user.company }}
{% endif %}
{% block content %}{% endblock %}