Django TemplateView и форма

у меня есть проблема, чтобы выяснить, как новые представления django (вид шаблона) и формы могут работать, я также не могу найти хорошие ресурсы, официальный документ не объясняет мне, как получить запрос (я имею в виду get и 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,
    })

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

2 ответов


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

в основном: Когда вы выдаете запрос: "'http://mydomain/myblog/foo/bar"' Джанго будет:

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

функция view обычно делает следующее:

  1. заполните контекст dict для представления
  2. отображает шаблон, используя этот контекст
  3. возвращает результирующую строку

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

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

from django.views.generic import TemplateView

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

все взгляды.родовой.*Вид занятия вид.родовой.Вид как их база. В docs для этого вы найдете необходимую вам информацию. В основном:

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

MyView.as_view создаст вызываемый объект, который вызывает представления.родовой.Вид.отправка() который в свою очередь вызовет MyView.get (), MyView.post (), MyView.обновление() и т. д. которые вы можете переопределить.

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

посмотреть класс

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

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

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

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

  1. наследование делает их сухой.
  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 имеет больше смысла.