1

关于基于类的视图的 Django 1.3 文档似乎是一场寻宝游戏。类怎么写已经够清楚了……但是每个泛型类匹配什么样的模板代码呢?有人会提供一个完整的坚果汤示例吗?这是我到目前为止所拥有的:

网址.py

(r'^brand_create2$',    BrandCreate.as_view()),

视图.py

from django.views.generic import CreateView
@login_required
class BrandCreate(CreateView):
    template_name       = 'generic_form_popup.html'
    context_object_name = "brand_thingie"
    #queryset            = models.Brand.objects.all()
    success_url         = '/'

generic_form_popup.html

????

在这种情况下,我正在探索是否值得学习新风格,因为旧风格仍然有效:

网址.py

url(r'^brand_create1$', 'coat.views.brand_create'),

视图.py

class formBrand(forms.ModelForm):
    class Meta:
        model = models.Brand
        exclude = ('')

@login_required
def brand_create(request):

    form = formBrand
    if request.method == 'POST':
        form = formBrand(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/')

    passed = dict(
        form=form,
        MEDIA_URL  = settings.MEDIA_URL,
        STATIC_URL = settings.STATIC_URL)
    return render_to_response('generic_form_popup.html',
    passed, context_instance=RequestContext(request))

generic_form_popup.html

{% extends 'head-plain.html' %}
{% block title %}{% endblock %}
{% block headstuff %}{% endblock %}
{% block content %}   
<form action="{{ action }}" method="post">
{% csrf_token %}{{ form.as_p }}
<input type="submit" value="Submit" /> </form>    
{% endblock %}
4

1 回答 1

0

CreateView 继承自ModelFormMixin,后者又继承自FormMixinSingleObjectMixin

SingleObjectMixin提供对象模板上下文变量,这在 CreateView 的情况下可能没有任何用处:

object:此视图正在显示的对象。如果指定了 context_object_name,该变量也将在上下文中设置,与 object 具有相同的值。

但是FormMixin提供了表单上下文变量

form:为视图生成的表单实例。

因此,您可以参考文档以显示带有模板的表单

<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

这意味着您发布的模板几乎应该与基于类的视图一起使用:

{% extends 'head-plain.html' %}
{% block title %}{% endblock %}
{% block headstuff %}{% endblock %}
{% block content %}   
<form action="" method="post">
{% csrf_token %}{{ form.as_p }}
<input type="submit" value="Submit" /> </form>    
{% endblock %}

我删除了{{ action }},因为它不是 context 的一部分,既不是在旧式视图中,也不是基于类的视图,所以它没有任何意义。您应该知道,如果 action="" 则浏览器将提交到当前 url。您可以使用 action="{{ request.path }}" 强制对当前 url 执行操作,也可以使用url 模板标签指定另一个 url 。

假设应用命名 url patterns的最佳实践,通过更改:

(r'^brand_create2$',    BrandCreate.as_view()),

至:

(r'^brand_create2$',    BrandCreate.as_view(), name='band_create'),

然后你可以使用:action="{% url band_create %}"

您还可以进一步自定义

<form action="/contact/" method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
    <div class="fieldWrapper">
        {{ form.message.errors }}
        <label for="id_message">Your message:</label>
        {{ form.message }}
    </div>
    <div class="fieldWrapper">
        {{ form.sender.errors }}
        <label for="id_sender">Your email address:</label>
        {{ form.sender }}
    </div>
    <div class="fieldWrapper">
        {{ form.cc_myself.errors }}
        <label for="id_cc_myself">CC yourself?</label>
        {{ form.cc_myself }}
    </div>
    <p><input type="submit" value="Send message" /></p>
</form>

当然,表单中可用的字段取决于您的 Model

于 2012-02-27T08:29:19.890 回答