0

名前と電子メール アドレスをデータベースに保存するフォームを作成しようとしています。しかし、保存されません... 別のテンプレートで同じフォームを使用したいので、包含タグを使用しました。これは私のmodels.pyです:

class Contact(models.Model):
    FRAU = 'FR'
    HERR= 'HR'
    GENDER_CHOICES = (
        (FRAU, 'Frau'),
        (HERR, 'Herr'),
    )
    gender = models.CharField(max_length=2, choices=GENDER_CHOICES, default=FRAU)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=200)
    email = models.EmailField()

    def __unicode__(self):
        return "%s %s" %(self.first_name, self.last_name)

これは私のforms.pyです:

class FragenContactForm(ModelForm):
    class Meta:
        model = Contact
        fields = ['gender', 'first_name', 'last_name', 'email']

これは私のカスタムタグモジュールです:

from django import template
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from fragen.forms import FragenContactForm


register = template.Library()

@register.inclusion_tag('fragen/askforoffer.html', takes_context=True)
    def askforoffer(context):
    form = FragenContactForm(context['request'].POST or None)
    if context['request'].method=='POST':
        if form.is_valid():
            form.save()
        return HttpResponseRedirect(reverse('fragen/thanks.html'))
    else:
        messages.error(context['request'], "Error")
    return {'form': FragenContactForm()}

フォームに入力して送信した後、データベースに何も表示されません。何か不足していますか?ありがとう!

4

3 に答える 3

0

You have to handle form-processing in a view function.

from django.shortcuts import redirect, render
from fragen.forms import FragenContactForm

def askforoffer(request):
    form = FragenContactForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('specify_thank_url_here')

    return render(request, 'fragen/askforoffer.html',
                  { 'form': form })

I've never seen any form processing in an inclusion tag and I doubt this will work. Above view-function may point you in the right direction.

于 2015-06-28T20:25:59.007 に答える
0

異なるテンプレートで同じフォームを使用したいので、包含タグを使用しました。

単純にフォームを再利用できます。または、この場合のフォームは非常に単純であるため、CreateViewジェネリック クラス ベースのビューを使用してコードをさらに削減できます。

ビューには次のものが含まれます。

class OfferForm(CreateView):
    template_name = 'fragen/askforoffer.html'
    model = Contact
    fields = ['gender', 'first_name', 'last_name', 'email']
    success_url = 'fragen/thanks.html'

Django は自動的に を作成しModelForm、エラーのリダイレクトとフィールドの保存を処理します。

テンプレートでは、これfragen/askforoffer.htmlだけが必要です。

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

最後に、あなたのurls.py

url(r'^submit-offer/$', OfferForm.as_view(), name='offer-form')

同じフォームを複数の場所に表示するには、URL にマップするだけです。

url(r'^another-form/$', OfferForm.as_view(), name='another-form')

最後に、__unicode__メソッドは Unicode オブジェクトを返す必要があります。あなたのモデルでは:

def __unicode__(self):
    return u"{} {}".format(self.first_name, self.last_name)

テンプレートがレンダリングされる前にテンプレート タグ コードが実行されるため、実行しようとしている方法は機能しません。したがって、ユーザーがフォームを見る頃には、タグ コードはすでに完成しています。再度「トリガー」する方法はありません。そのため、フォームに入力されたデータを受け入れる従来のビュー メソッドが必要です。

于 2015-06-28T20:35:10.067 に答える
0

Postビューによって処理されるサーバーリクエストのメソッドです。

包含タグはページとともにレンダリングされます (つまり、サーバーの応答中)。したがってrequest.POST、POST を意図的にコンテキスト変数としてページに送信しないと、ページ コンテキストを取得できません (ただし、request.POST にはなりません - some_variable だけです)。ちょっと変な感じ..

于 2015-06-28T18:44:19.057 に答える