【发布时间】:2017-02-14 05:31:36
【问题描述】:
在我的登录页面/主页上,我想添加一个联系表单和一个订阅时事通讯表单。由于我想将两种表单的逻辑保留在不同的应用程序中,我想知道如何在用户输入错误的情况下使用 Django 的内部表单错误处理。与标准表单错误处理类似,我希望登录页面在表单字段旁边重新加载错误。如果逻辑保留在同一个应用程序中,这相当容易,但是当逻辑在另一个应用程序中时,我无法理解如何执行此操作。这是基本布局:
项目/views.py:
from django.views.generic.base import TemplateView
from contact.forms import ContactForm
from newsletter.forms import NewsletterForm
class HomeView(TemplateView):
template_name = "home.html"
contact_form = ContactForm()
newsletter_form = NewsletterForm()
title = "Home"
联系人/forms.py
from django import forms
from .models import Contact
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
fields = ['contact_name', 'contact_email', 'content']
widgets = {
'contact_name': forms.TextInput(attrs={'placeholder': 'Your name'}),
'contact_email': forms.TextInput(attrs={'placeholder': 'Your Email address'}),
'content': forms.Textarea(attrs={'placeholder': 'Your message'}),
}
联系人/models.py
from django.db import models
class Contact(models.Model):
contact_name = models.CharField(max_length=120)
contact_email = models.EmailField()
content = models.TextField()
timestamp = models.TimeField(auto_now_add=True, auto_now=False)
def __str__(self):
return self.contact_name + self.timestamp
联系人/views.py
from django.shortcuts import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views import View
from .forms import ContactForm
class SendContactForm(View):
form_class = ContactForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
print("all ok")
return HttpResponseRedirect(reverse_lazy('home'))
else:
print(form.contact_name.errors)
return HttpResponseRedirect(reverse_lazy('home'))
所以现在的问题是联系人(或时事通讯)视图和项目视图必须如何处理 Django 正常内部表单处理的错误(在不正确的输入字段旁边添加错误消息)。
感谢您的帮助!
更新: 我想分享我最终使用的解决方案。也许有一个最佳实践是如何在首页上显示多个表单,但在各自的应用程序中处理逻辑。但是,这最终对我有用。
项目/views.py:
from django.views.generic.base import TemplateView
from contact.forms import ContactForm
from newsletter.forms import NewsletterForm
class HomeView(TemplateView):
template_name = "home2.html"
title = "Home"
def get_context_data(self, **kwargs):
context = super(HomeView, self).get_context_data(**kwargs)
try:
old_contact_form = self.request.session["contact_form"]
except:
old_contact_form = None
try:
old_newsletter_form = self.request.session["newsletter_form"]
except:
old_newsletter_form = None
context["contact_form"] = ContactForm(old_contact_form)
context["newsletter_form"] = ContactForm(newsletter_form)
return context
联系人/views.py:
from django.shortcuts import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views import View
from .forms import ContactForm
class SendContactForm(View):
form_class = ContactForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
print("all ok")
else:
request.session["contact_form"] = request.POST
return HttpResponseRedirect(reverse_lazy("home"))
在各自的时事通讯中也是如此。使用会话对我有用。
【问题讨论】: