0

그래서 이미 잘 작동하는 나의 register() 양식을 작성했습니다. 현재 login() 양식을 작성하려고하는데, BoxesView()의 form_class에 2 개의 값을 추가 할 수 없어 필드 (usernamepassword)가 표시되지 않습니다. 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

: 여기에 내 코드입니다 FormMixinform_class을 사용하는 방법을 알기 원한다면, 코드를 읽을 수 있습니다 - 이봐 요, 당신이 알고있는 오픈 소스입니다.

FormMixin의 코드 here을 확인한 경우 form_class은 놀랍게도 양식을 생성하는 데 사용됩니다.

이제/질문을 WRT, 당신은 주로 두 가지 옵션이 있습니다

  1. 도랑 FormMixin (여러 양식을 처리하도록 설계되지 않음) 당신이 당신의 뷰 클래스에 필요한 구현
  2. 도랑 클래스 기반 뷰는 완전하고 좋은 오래된보기 기능을 쓰기

오해하지 마십시오 클래스 기반 뷰는 물건을 꽤 많이 괜찮하지만, 때로는 일반 기능 기반의 뷰는 단지 방법 (WR)에 간단 ite, 읽기 및 유지.