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迭代,閱讀和維護。

相關問題