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"' Джанго будет:
- разрешить
myblog/foo/bar
для вызова функции / метода через шаблоны, определенные в urls.py - вызовите эту функцию с запросом в качестве параметра, например
myblog.views.foo_bar_index(request)
. - и просто послать какую бы строку эта функция ни возвращала браузеру. Обычно это ваш сгенерированный HTML код.
функция view обычно делает следующее:
- заполните контекст dict для представления
- отображает шаблон, используя этот контекст
- возвращает результирующую строку
общий вид шаблона позволяет пропустить запись этой функции и просто передать в контекстном словаре.
цитировать документы 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 как переменные экземпляра, поэтому любой метод вид может знать полный подробности запроса, который был сделан для вызова представления.
большие плюсы взглядов на основе класса (на мой взгляд):
- наследование делает их сухой.
- более декларативная форма программирования
вместо этого используйте 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 имеет больше смысла.