0

所以我已经完成我的register()表单,这是正常工作。我现在试图做我的login()表单,但是字段(usernamepassword)没有显示出来,因为我无法在BoxesView()中将2个值添加到form_class。注册表单中的form_class已经有了一个值,所以我需要添加另一个值。说实话,我并不完全确定form_class是如何在这里工作的,或者如果可以添加另一个,所以如果有人能够解释这很好。这里是我的代码:如何在FormMixin中添加两个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> 

回答

1

如果你婉吨知道如何FormMixin使用form_class,你可以只读代码 - 嘿,这是你知道的开源。

所以,如果你检查FormMixin的代码here,你发现form_class是 - 意外的惊喜 - 用于实例化表单。

现在WRT /您的问题,主要有两种选择:

  1. 沟FormMixin(这不是设计来处理多个形式),并实现您在您的视图类需要什么
  2. 沟类为主意见完全谱写美好的旧取景功能

不要误会我的意思:基于类的意见都很好,相当多的东西,但有时简单的基于函数的观点只是方式简单WR迭代,阅读和维护。

相关问题