python - 如何在 FormMixin 中添加两个 form_class?

标签 python django django-forms django-views django-generic-views

所以我已经完成了 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 - 令人惊讶 - 用于实例化您的表单。

现在针对您的问题,您主要有两个选择:

  1. 放弃 FormMixin(它不是为处理多种表单而设计的)并在 View 类中实现您需要的内容
  2. 完全放弃基于类的 View 并编写一个好的旧 View 函数

不要误会我的意思:基于类的 View 对于很多东西来说都很好,但有时简单的基于函数的 View 只是方式更容易编写、阅读和维护。 p>

关于python - 如何在 FormMixin 中添加两个 form_class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182875/

相关文章:

python - 如何在表单中获取 session ?

Django 将自定义表单参数传递给 ModelFormset

django - 将 form_list 表单实例保存到数据库的正确方法?

python - 如何将一个数字的格式复制到另一个数字?

python - 如何使用 ftplib 在远程服务器上创建 .txt 文件并使用变量在其中放置一些字符串?

python - 你如何在 python 中设置 __contains__ 方法?

python - 如何使用 Django 检索多个查询参数值?

python - mysql-python mac OSX 10.10 禁用安全身份验证

django-taggit 从查询集中创建 tagcloud

python - django shell 触发 Postgres 空闲事务问题