如何在django的CreateView中使用上下文和类?
如何在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
#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'