【问题标题】:Django: can't access OneToOneField after rendering TemplateView FormDjango:渲染 TemplateView 表单后无法访问 OneToOneField
【发布时间】:2018-03-19 08:29:50
【问题描述】:

我是 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 类来处理创建公司模型的获取和发布请求:

# 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 即使设置了也没有显示;它仅在我重定向到索引时显示,但在我呈现表单时不显示。

有人可以帮我了解这是什么原因吗?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:
    {% if request.user.is_authenticated %}
        {% request.user.company %}
    {% endif %}
    

    您没有向base.html 发送任何上下文,因此只有user 不起作用。

    【讨论】:

    • 刚试过但没有任何改变;还是不行
    • 是的,因为你不能把它放在base.html中,你需要把它放在这里,在base.html中做一个块,然后把这段代码放在form.html中的那个块中
    • 实际上是在导航栏中,并且显示用户是否已通过身份验证.. :/
    • 没问题,只要在那个地方放一个块,然后从form.html调用那个块
    • 仅为表单创建了另一个 base.html,并将导航部分包含在 form.html 中;它正在工作,但很确定这不是我应该这样做的正确方法,因为 base.html 和 base_form.html 是相同的,除了这个导航下拉块移动到 form.html。感谢您的帮助!
    【解决方案2】:

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

    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 %}
    

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 2011-12-29
      • 2023-04-04
      • 2018-11-13
      • 2011-10-04
      • 2016-01-17
      • 2023-03-13
      • 2013-10-10
      • 2018-12-22
      相关资源
      最近更新 更多