【问题标题】:How to use context with class in CreateView in django?如何在 django 的 CreateView 中使用上下文与类?
【发布时间】:2014-01-02 06:22:03
【问题描述】:

如何在 django 的 CreateView 中使用上下文和类?

在我拥有之前:

#views.py
from django.views.generic import CreateView
from cars.models import *

def CreateCar(CreateView):
    info_sended = False
    if request.method == 'POST':
        form = FormCar(request.POST, request.FILES)
        if form.is_valid():
            info_sended = True
            form.save()
    else:
        form = FormCar()
    ctx = {'form': form, 'info_sended':info_sended}
    return render_to_response("create_car.html", ctx,
        context_instance=RequestContext(request))

现在,试试吧:

class CreateCar(CreateView):
    info_sended = False
    template_name = 'create_car.html'
    model = Car
    success_url = 'create_car' #urls name

    def form_valid(self, form):
        info_sended = True
        ctx = {'form': form, 'info_sended':info_sended}
        return super(CreateCar, self).form_valid(form)

我的html页面是:

<!-- create_car.html -->
{% extends 'base.html' %}

{% block content %}

{% if info_sended %}
    <p>Data saved successfully</p>
    <p><a href="{% url 'list_cars' %}">Show List</a></p>
{% else %}
    <form class="form-horizontal" action="" method="post">
        {% csrf_token %}
        {% include "form.html" %}
        <div class="col-md-offset-1">
            <button class="btn btn-primary" type="submit">Add</button>
        </div>
    </form>
{% endif %}

{% endblock %}

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    您应该在类视图中定义get_context_data() 方法。将您的代码更新为

    from django.shortcuts import render
    
    class CreateCar(CreateView):
        info_sended = False
        template_name = 'create_car.html'
        model = Car
        success_url = 'create_car' #urls name
    
        def form_valid(self, form):
            self.info_sended = True
            # Instead of return this HttpResponseRedirect, return an 
            #  new rendered page
            super(CreateCar, self).form_valid(form)
            return render(self.request, self.template_name,
                          self.get_context_data(form=form))
    
    
        def get_context_data(self, **kwargs):
            ctx = super(CreateCar, self).get_context_data(**kwargs)
            ctx['info_sended'] = self.info_sended
            return ctx
    

    【讨论】:

    • 解决方案中的小错误“ctx = return super(CreateCar, self).get_context_data(**kwargs)”应该是“ctx = super(CreateCar, self).get_context_data(**kwargs)”
    • 我们可以将渲染的上下文传递给 form_valid 吗?我有一个关于同一stackoverflow.com/questions/56325133/… 的问题
    【解决方案2】:

    你必须使用get_context_data

    class CreateCar(CreateView):
        info_sended = False
        template_name = 'create_car.html'
        model = Car
        success_url = 'create_car' #urls name
    
        def form_valid(self, form):
            self.info_sended = True
            return super(CreateCar, self).form_valid(form)
    
        def get_context_data(self, **kwargs):
            ctx = super(CreateCar, self).get_context_data(**kwargs)
            ctx['info_sended'] = self.info_sended
            return ctx
    

    如果你看到django sourceCreateView继承自BaseCreateView这个继承自ModelFormMixin反过来这个继承自FormMixin并且这个继承自ContextMixin并且这个定义的唯一方法是get_context_data。 希望对您有所帮助。

    PD:为了更好地理解 Python 中的继承,这可能有点令人困惑,请随意阅读 article 关于 MRO。

    【讨论】:

    • 好的,我按照您的指示做了,但没有返回成功消息。我的意思是,返回 info_sended = True,但未逐项返回 html 消息。
    • 我不明白你的意思,但未逐项返回html消息。
    【解决方案3】:

    由于您正在创建 Car 的新实例,因此 get_context_data 没有上下文,因为还没有对象。如上所述,我没有测试使用 Mixin 从另一个类中获取上下文,但这似乎是合理的。但是,如果我可以假设您想使用基本的CreateViewUpdateViewDeleteView,那么我通过假设我没有CreateView 的上下文来解决这个问题。然后在我的模板中,我使用了 if 来做出决定,例如:

    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value={% if not buttonword %}Save{% else %}{{ buttonword }}{% endif %}>
    </form>
    

    DeleteView我包括:

    context['buttonword'] = 'Delete'
    

    UpdateView我包括:

    context['buttonword'] = 'Update'
    

    正如我所说,我没有在CreateView 中设置buttonword。因此,当模板逻辑完成时,如果分配了buttonword,则其中的单词会显示在按钮中,否则会显示在按钮上。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多