所以我已经完成了 register()
表单,该表单工作正常。我现在正在尝试执行我的 login()
表单,但是字段(用户名
和 密码
)没有显示,因为我无法向 BoxesView()
中的 form_class 添加 2 个值。 form_class 中已经有一个用于注册表单的值,因此我需要添加另一个值。老实说,我不完全确定 form_class 在这里是如何工作的,或者是否可以添加另一个,所以如果有人可以解释那就太好了。这是我的代码:
views.py
class BoxesView(ListView, FormMixin):
template_name = 'polls.html' # extends base.html
form_class = UserRegistrationForm
def get_context_data(self, **kwargs):
context = super(BoxesView, self).get_context_data()
question_list = Question.objects.all().order_by('-date')
choice = Choice.objects.all()
context['question_list'] = question_list
context['choice'] = choice
q_list = []
returned_list = []
for i in question_list:
q_list.append(i)
for a, b in CATEGORY_CHOICES:
name = resolve(self.request.path_info).url_name
if b == name:
category = a
search = self.request.GET.get('search')
posts = Post.objects.all().filter(category=category).order_by('-date')
if search:
posts = posts.filter(
Q(title__icontains=search) |
Q(content__icontains=search)
)
else:
posts = Post.objects.all().filter(category=category).order_by('-date')
context['posts'] = posts
total = 0
for post in posts:
returned_list.append(post)
total += 1
if total == 4:
total = 0
for i in q_list:
returned_list.append(i)
q_list.remove(i)
break
paginator = Paginator(returned_list, 14)
page = self.request.GET.get('page')
try:
lst = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
lst = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
lst = paginator.page(paginator.num_pages)
context['lst'] = lst
return context
def get_queryset(self):
pass
def register(request):
form = UserRegistrationForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
email = form.cleaned_data['email']
user = User.objects.create_user(username=username, password=password, email=email)
user.save()
return redirect('/')
else:
form = UserRegistrationForm()
return redirect('/')
def user_login(request):
form_login = UserLoginForm(request.POST)
if form_login.is_valid():
username = form_login.cleaned_data['username']
password = form_login.cleaned_data['password']
user = authenticate(username=username, password=password)
login(request, user)
else:
form_login = UserLoginForm()
return redirect('/')
forms.py
class UserLoginForm(forms.ModelForm):
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'password'
]
class UserRegistrationForm(forms.ModelForm):
email = forms.EmailField()
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'email',
'password',
'confirm_password',
]
base.html
<form method="post" enctype="multipart/form-data" action="{% url 'user_login' %}">{% csrf_token %}
<div class="loginWrapper">
<div class="login">
<div class="loginBox">
{{ form_login.username }}
{{ form_login.password }}
<input type="submit" value="login" style="margin-left: 10px"/>
</div>
</div>
</div>
</form>
<form method="post" enctype="multipart/form-data" action="{% url 'register' %}">{% csrf_token %}
<div class="registerWrapper">
<div class="register">
<div class="registerBox">
{{ form.errors }}
{{ form.username|placeholder:"username" }}
{{ form.email|placeholder:"email" }}
{{ form.password|placeholder:"password" }}
{{ form.confirm_password|placeholder:"confirm password" }}
<input type="submit" value="register" />
</div>
</div>
</div>
</form>
最佳答案
如果你想知道 FormMixin
如何使用 form_class
,你可以阅读代码 - 嘿,你知道它是开源的。
因此,如果您检查 FormMixin
的代码 here ,您会发现 form_class
- 令人惊讶 - 用于实例化您的表单。
现在针对您的问题,您主要有两个选择:
- 放弃 FormMixin(它不是为处理多种表单而设计的)并在 View 类中实现您需要的内容
- 完全放弃基于类的 View 并编写一个好的旧 View 函数
不要误会我的意思:基于类的 View 对于很多东西来说都很好,但有时简单的基于函数的 View 只是方式更容易编写、阅读和维护。 p>
关于python - 如何在 FormMixin 中添加两个 form_class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182875/