Django TemplateView и форма

У меня есть некоторая проблема, чтобы понять, как могут работать новые представления django (просмотр шаблона) и формы. Я также не могу найти хорошие ресурсы, официальный документ не объясняет мне, как получить запрос (я имею в виду get and post) и формы в новом классе представлений django

Спасибо

добавлено для лучшего объяснения

например, у меня есть эта форма:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

и это код для чтения и печати формы (старомодный способ):

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

Ну, мой вопрос в том, как вы можете сделать то же самое с просмотром шаблонов спасибо

Ответ 1

Я бы порекомендовал просто поклониться официальному учебному посоку , и я думаю, что реализация начнется и просветление придет автоматически.

В основном: Когда вы отправляете запрос: '' 'http://mydomain/myblog/foo/bar' '' Django будет:

  • разрешить myblog/foo/bar вызов функции/метода через шаблоны, определенные в urls.py
  • вызов этой функции с запросом в качестве параметра, например. myblog.views.foo_bar_index(request).
  • и просто отправьте любую строку, возвращаемую функцией в браузер. Обычно это ваш сгенерированный HTML-код.

Функция просмотра обычно выполняет следующие действия:

  • Заполните контекст dict для представления
  • Отображает шаблон с использованием этого контекста
  • возвращает результирующую строку

Общий шаблон шаблона позволяет пропустить запись этой функции и просто перейти в словарь контекста.

Цитата django docs:

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

Все view.generic. * В классах View есть view.generic.View в качестве базы. В docs вы найдете нужную вам информацию. В основном:

# urls.py
urlpatterns = patterns('',
        (r'^view/$', MyView.as_view(size=42)),
    )

MyView.as_view генерирует вызываемый вызов, который вызывает views.generic.View.dispatch() который, в свою очередь, вызовет MyView.get(), MyView.post(), MyView.update() и т.д. которые вы можете переопределить.

Чтобы процитировать документы:

class View

отправка (запрос, * args, ** kwargs)

Часть представления - метод, который принимает запрос аргумент плюс аргументы и возвращает ответ HTTP. По умолчанию реализация проверит HTTP-метод и попытается делегировать метод, который соответствует методу HTTP; GET будет делегирован get(), POST для post() и т.д.

Реализация по умолчанию также задает запрос, args и kwargs как переменные экземпляра, поэтому любой метод на представлении может знать полный подробности запроса, который был сделан для вызова представления.

Большие плюсы классических взглядов (на мой взгляд):

  • Наследование делает их сухими.
  • Более декларативная форма программирования

Ответ 2

Вместо этого используйте FormView, т.е.

from django.views.generic import TemplateView, FormView

from forms import ContactUsEmailForm


class ContactView(FormView):
    template_name = 'contact_us/contact_us.html'
    form_class = ContactUsEmailForm
    success_url = '.'

    def get_context_data(self, **kwargs):
        context = super(ContactView, self).get_context_data(**kwargs)
        #context["testing_out"] = "this is a new context var"
        return context

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        #form.send_email()
        #print "form is valid"
        return super(ContactView, self).form_valid(form)

Подробнее о FormView в Django Docs

Технически TemplateView также можно использовать, просто перезапишите метод post, поскольку по умолчанию шаблон не позволяет вам публиковать его:

class ContactUsView(TemplateView):
    template_name = 'contact_us/contact_us.html'

    def post(self, request, *args, **kwargs):
        context = self.get_context_data()
        if context["form"].is_valid():
            print 'yes done'
            #save your model
            #redirect

        return super(TemplateView, self).render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super(ContactUsView, self).get_context_data(**kwargs)

        form = ContactUsEmailForm(self.request.POST or None)  # instance= None

        context["form"] = form
        #context["latest_article"] = latest_article

        return context

Я думаю, что FormView имеет больше смысла.