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

如何在django的CreateView中使用上下文和类?,django,django-views,Django,Django Views,如何在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

如何在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 %}

{%extends'base.html%}
{%block content%}
{%if信息\已发送%}
已成功保存数据

{%else%} {%csrf_令牌%} {%include“form.html”%} 添加 {%endif%} {%endblock%}
您应该在类视图中定义方法。将代码更新为

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
你必须使用

如果您看到从这个继承的继承依次从这个继承和这个继承,并且这个继承定义的唯一方法是
get\u context\u data
。 希望这对你有帮助


PD:为了更好地理解Python中的继承,这可能有点混乱。请不要阅读关于MRO的文章。

因为您正在创建一个新的Car实例,所以没有用于
get\u context\u data
的上下文,因为还没有对象。我没有像上面所建议的那样,使用Mixin从另一个类获取上下文,但这似乎是合理的。但是,如果我可以假设您想要使用基本的
CreateView
UpdateView
DeleteView
,那么我就假设我没有
CreateView
的上下文来解决这个问题。然后,在我的模板中,我使用了if来做出决策,例如:

<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value={% if not buttonword %}Save{% else %}{{ buttonword }}{% endif %}>
</form>
在更新视图中,我包括:

context['buttonword'] = 'Delete'
context['buttonword'] = 'Update'

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

好的,我按照你的指示做了,但没有返回成功消息。我的意思是,returns info_sended=True,but not itemized返回html消息。我不理解您的意思,but not itemized返回html消息。解决方案中的小错误“ctx=return super(CreateCar,self)。get_context_data(**kwargs)”应该是“ctx=super(CreateCar,self)。get_context_data(**kwargs)我们可以将呈现的上下文传递给form\u valid吗?我有一个同样的问题
context['buttonword'] = 'Update'