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 имеет больше смысла.