【问题标题】:compare value of form in view django在视图 django 中比较表单的值
【发布时间】:2020-05-21 07:29:54
【问题描述】:

View.py

类注册(模板视图):

template_name = 'registration.html'

def get(self, request, *args, **kwargs):

    form = CreateForm()

    return render(request, self.template_name, {'form': form})

@staticmethod

def post(request):
    try:
        data = request.POST.get
        user = User(
            first_name=data('first_name'),
            last_name=data('last_name'),
            username=data('username').strip(),
            email=data('email'),
        )
        user.set_password(data('password').strip())
        user.save()
        request.session["user_id"] = user.id
        return HttpResponse(' Save successfully ')

    except Exception as c:
        return HttpResponse("Failed :  {}".format(c), 500)

Form.py

role_choice= (("Customer", "Customer"), ("Employee", "Employee"))

类 CreateForm(forms.Form):

first_name = forms.CharField(label="Enter Your First Name", max_length=30, required=True)

last_name = forms.CharField(label="Enter Your Last Name", max_length=30, required=True)

username = forms.CharField(required=True, widget=forms.TextInput())

email = forms.CharField(required=True, widget=forms.TextInput())

password = forms.CharField(required=True, widget=forms.PasswordInput())

role = forms.ChoiceField(choices=role_choice, widget=forms.RadioSelect())

类客户(forms.Form):

contact = forms.IntegerField(label="Enter your contact number", required=True, )

amount = forms.IntegerField(required=True, min_value=500)

type = forms.ChoiceField(choices=choice)

Model.py

类客户(models.Model):

user = models.ForeignKey(User, on_delete=models.CASCADE)

contact = models.BigIntegerField()

amount = models.BigIntegerField()

type = models.CharField(max_length=1)

模板

{% 扩展“home.html” %}

{% 加载crispy_forms_tags %}

{% block title %}创建帐户{% endblock %}

{% 块内容 %}

<div>

    {% csrf_token %}

    {{ form|crispy }}

  <button type="submit">Submit</button><br>

</div>

{% 端块 %}

注册后,当用户在提交表单后选择客户选项时,如果用户选择员工选项,我会转到客户页面,他/她会转到员工页面,但我不知道该怎么做

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    首先,我强烈建议不要自己写所有的观点等等。 Django 已经拥有很多工具。它有一个可以稍微修改的UserCreationForm [Django-doc]。例如:

    # app/forms.py
    
    from django import forms
    from django.contrib.auth.forms import UserCreationForm
    
    class RoleUserCreationForm(UserCreationForm):
        ROLES = (
            ('Customer', 'Customer'),
            ('Employee', 'Employee')
        )
        role = forms.ChoiceField(choices=ROLES, widget=forms.RadioSelect())
    
        class Meta(UserCreationForm.Meta):
            fields = (*UserCreationForm.Meta.fields, 'first_name', 'last_name')

    因此,我们可以在这里为first_namelast_name 添加额外的字段。

    现在我们可以在CreateView [Django-doc] 中使用它,并覆盖form_valid(..) method [Django-doc]

    # app/views.py
    
    from app.forms import RoleUserCreationForm
    from django.contrib.auth import get_user_model
    from django.shortcuts import redirect
    from django.views.generic.edit import CreateView
    
    class RegisterView(CreateView):
        model = get_user_model()
        form_class = RoleUserCreationForm
    
        def form_valid(self, form):
            request.session['user_id'] = self.object.id
            if form.cleaned_data['role'] == 'Customer':
                return redirect('name-of-customer-view')
            else:
                return redirect('name-of-employee-view')

    您将 'name-of-customer-view''name-of-employee-view' 分别替换为这些视图的名称。

    【讨论】:

    • 当我提交数据时它会显示这个错误。 post() 缺少 1 个必需的位置参数:'form'
    • @MuhammadUsman:您根本不应该覆盖 post 方法。 CreateView 实现了样板逻辑。
    • def post(request, form): try: data = request.POST.get user = User( first_name=data('first_name'), last_name=data('last_name'), username=data ('username').strip(), email=data('email'), ) user.set_password(data('password').strip()) user.save() request.session["user_id"] = user .id if form.cleaned_data['role'] == 'Customer': return redirect('new_employee') else: return redirect('/')
    • @MuhammadUsman:您可以在 form 上添加 first_name 等,而不是在 view 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2022-12-29
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2015-05-09
    相关资源
    最近更新 更多