1

クラスベースのビューに関するDjango1.3のドキュメントは、宝探しのようです。クラスの書き方は十分に明確です...しかし、どのような種類のテンプレートコードが各ジェネリッククラスに一致しますか?誰かがナッツに完全な例のスープを提供しますか?これが私がこれまでに持っているものです:

urls.py

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

views.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

????

この場合、古いスタイルがまだ機能していることを考えると、新しいスタイルを学ぶ価値があるかどうかを調べています。

urls.py

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

views.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 を継承し、ModelFormMixinFormMixinSingleObjectMixinを継承します。

SingleObjectMixinは、オブジェクトテンプレートコンテキスト変数を提供します。これは、CreateViewの場合にはおそらく使用されません。

object:このビューが表示しているオブジェクト。context_object_nameが指定されている場合、その変数もオブジェクトと同じ値でコンテキストに設定されます。

しかし、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 }}、古いスタイルのビューでも、クラスベースのビューでもないため、削除しました。そのため、意味がありません。action = ""の場合、ブラウザは現在のURLに送信することを知っておく必要があります。action = "{{request.path}}"を使用してアクションを現在のURLに強制するか、 urlテンプレートタグを使用して別のURLを指定できます。

次のように変更して、URLパターンに名前を付けるベストプラクティスを適用するとします。

(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>

もちろん、フォームで使用できるフィールドはモデルによって異なります

于 2012-02-27T08:29:19.890 に答える