【问题标题】:Within a template distinguish between create and update form在模板中区分创建和更新表单
【发布时间】:2013-09-14 21:44:24
【问题描述】:

如果 CreateView 和 UpdateView 使用相同的模板“model_form.html”,那么在模板中我将如何区分创建或更新表单?

我的一般看法如下

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    model = Author


class AuthorUpdateView(UpdateView):
    form_class = AuthorForm
    model = Author

AuthorForm如下

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('first_name', 'last_name')

我的模板如下

<form action="" method="post">
            {% csrf_token %}
            <table border="0" cellpadding="4" cellspacing="0">
                <tr>
                    <td>First Name</td>
                    <td>{{ form.first_name.errors }}{{ form.first_name }}</td>
                </tr>
                <tr>
                    <td>Last Name</td>
                    <td>{{ form.last_name.errors }} {{ form.last_name }}</td>
                </tr>
            </table>
            {% if form.isNew %}
                <input type="submit" value="Update Author" />
            {% else %}
                <input type="submit" value="Add Author" />
            {% endif %}
        </form>

在我的模板中,我想区分创建视图和更新视图?

【问题讨论】:

    标签: django


    【解决方案1】:

    在更新视图中,会有form.instance,而form.instance.pk 不会是None。在创建视图中,可能有也可能没有form.instance,但即使有form.instance.pk 也会是None。

    【讨论】:

      【解决方案2】:

      来自文档:

      CreateView

      对象

      使用 CreateView 时,您可以访问 self.object,这是正在创建的对象。如果对象尚未创建,值为 None

       

      UpdateView

      对象

      在使用 UpdateView 时,您可以访问 self.object,这是正在更新的对象。

      解决方案:

      {% if object %}
          <input type="submit" value="Update Author" />
      {% else %}
          <input type="submit" value="Add Author" />
      {% endif %}
      

      【讨论】:

      • 这是一个很好的解决方法,有没有更好的方法来做到这一点?
      【解决方案3】:

      在你的 CreateView 和 UpdateView 类中添加这个函数:

      # For Create
      def get_context_data(self, **kwargs):
              kwargs['naming'] = 'Create'
              context = super(CLASSNAME, self).get_context_data(**kwargs)
              return context
      
      # For Update
      def get_context_data(self, **kwargs):
              kwargs['naming'] = 'Update'
              context = super(CLASSNAME, self).get_context_data(**kwargs)
              return context
      

      然后使用 {{naming }}

      在您的模板中引用它们

      例子

      <button type="submit">{{ naming }}</button>
      

      【讨论】:

      • 使用一个模板创建/更新非常优雅。
      【解决方案4】:

      最简单的方法是使用模板yesno作为过滤器

      {{ object|yesno:'Update Author,Create Author' }}
      

      在你的情况下,因为作者在两者中都是同一个词,所以

      {{ object|yesno:'Update,Create' }} Author
      

      object 变为 yes 如果只有一个对象实例,那将是 update view 而它在 create view 中变为 no

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2012-12-20
        • 2012-10-28
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多