Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中将注册表填入数据库后,如何存储用户选择的单选按钮值?_Python_Django_Python 3.x_Django Forms_Mysql Python - Fatal编程技术网

Python 在django中将注册表填入数据库后,如何存储用户选择的单选按钮值?

Python 在django中将注册表填入数据库后,如何存储用户选择的单选按钮值?,python,django,python-3.x,django-forms,mysql-python,Python,Django,Python 3.x,Django Forms,Mysql Python,我正在使用django为我的网站创建注册页面。注册表包含以下字段:用户名、电子邮件、密码、密码确认、用户类型。用户类型可以是“学生”或“组织”,属于无线电选择类型。根据用户类型,用户只能执行为该类型分配的特定任务。所以我需要一种方法将他们的用户类型存储到数据库中,然后检查它,让他们执行特定的任务。我怎样才能解决这个问题 Forms.py from django import forms from django.contrib.auth.models import User from django

我正在使用django为我的网站创建注册页面。注册表包含以下字段:用户名、电子邮件、密码、密码确认、用户类型。用户类型可以是“学生”或“组织”,属于无线电选择类型。根据用户类型,用户只能执行为该类型分配的特定任务。所以我需要一种方法将他们的用户类型存储到数据库中,然后检查它,让他们执行特定的任务。我怎样才能解决这个问题

Forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

USER_TYPE_CHOICES = (
('student', 'Student'),
('organization', 'Organization'),)

class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
user_type = forms.ChoiceField(required=True,widget=forms.RadioSelect, choices=USER_TYPE_CHOICES)

class Meta:
    model = User
    fields = ['username', 'email', 'password1', 'password2','user_type']
Views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            uType = form.cleaned_data.get('user_type')
            messages.success(request, 'Account created for {}, You may login now!'.format(username))
            return redirect('TakeTest-Home')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

此应用程序的Models.py为空。

首先,您需要知道,django中的选项只是多对多字段

因此,您需要在models.py中声明它。它应该如下所示:

class Choices(models.Model):
  description = models.CharField(max_length=100)

class UserProfile(models.Model):
  user = models.ForeignKey(User, blank=True, unique=True, verbose_name='profile_user')
  choices = models.ManyToManyField(Choices)
  def __unicode__(self):
    return self.name
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Account created for {}, You may login now!'.format(username))
            return redirect('TakeTest-Home')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})
现在您可以根据它更改form.py

在views.py中保存表单数据,如下所示:

class Choices(models.Model):
  description = models.CharField(max_length=100)

class UserProfile(models.Model):
  user = models.ForeignKey(User, blank=True, unique=True, verbose_name='profile_user')
  choices = models.ManyToManyField(Choices)
  def __unicode__(self):
    return self.name
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Account created for {}, You may login now!'.format(username))
            return redirect('TakeTest-Home')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

我希望它会有所帮助。

因为表单字段的选择将是一个选定的字符串值,那么您可以将其作为charfield存储在您的模型中:

因此,
user\u type=models.CharField()

如果您的选择与示例中的相同:

USER_TYPE_CHOICES = (
('student', 'Student'),
('organization', 'Organization'),)
class User(models.Model):
    username = models.CharField(max_length=150)
    email = models.EmailField(max_length=254)
    password1 = models.CharField(max_length=50)
    password1 = models.CharField(max_length=50)
    user_type = models.CharField(max_length=20)
    creation_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.username
但是,您可以为表单中的选项指定整数值,如:

choices=(
        (0,'Student'),
        (1,'Organization'),
)
因此,在您的模型中,您将其保存为
user\u type=models.IntegerField()

由于每个用户只会保存一个值(一个选项),因此当您返回此字段值时,您只需根据稍后代码中的
if
else
值定义任务和权限

如果你想从模型中创建这个表单,那么你可以在你的模型中以非常相似的方式定义整个表单,包括选择值列表等等,但这不是问题的重点

因此,您的模型将如下所示,例如:

USER_TYPE_CHOICES = (
('student', 'Student'),
('organization', 'Organization'),)
class User(models.Model):
    username = models.CharField(max_length=150)
    email = models.EmailField(max_length=254)
    password1 = models.CharField(max_length=50)
    password1 = models.CharField(max_length=50)
    user_type = models.CharField(max_length=20)
    creation_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.username
如果愿意,也可以将提交的表单值直接保存到数据库中,如视图中所示:

from .forms import UserRegisterForm
from .models import User
# and so on imported

def register(request):
    if request.method == 'POST':

        username = request.POST.get('username')
        email = request.POST.get('email')
        password1 = request.POST.get('password1')
        password2 = request.POST.get('password2')
        user_type = request.POST.get('user_type')

        NewUser = User.objects.create(username = username, email = email, password1 = password1, password2 = password2, user_type = user_type)
        Try: 
            NewUser.full_clean(exclude=None, validate_unique=True)
            NewerUser.save()
            return HttpResponse('')
        except ValidationError as e:
            # Do something based on the errors contained in e.message_dict.
            # Display them to a user, or handle them programmatically.
            pass

        # you can send back messages here too    
        return HttpResponse('whatever')
    else:
        form = UserRegisterForm()
        return render(request, 'users/register.html', {'form': form})
当然,你可以像在你的问题中那样,用普通的表单保存方法来保存,我只是不想重复你的问题中的代码

问题的关键在于您可以将所选用户类型值保存为Charfield,也可以将所选值保存为模型中的IntegerField。在数据库中,每个用户只有一个值。然后,您可以稍后使用该值

更清楚一点的是,在每个注册用户的用户表中都有用户类型值后,您可以根据用户类型值以任何方式重定向任务:

def Usertask_sorting(task1, task2, username):
    Task1 = task1
    Task2 = task2
    Username = username
    field_name = 'user_type'
    obj = User.objects.get(username=Username)
    user_type_value = getattr(obj, field_name)
    if user_type_value == 'Student':
        # let them do task1 or whatever
        return redirect('student_form')
    elif user_type_value == 'Organization':
        # let the user do task2 something else
        return redirect('organization_form')
    else :
        # the user has no valid user_type set
        return redirect('profile_form')
我希望这能给你在这个问题上提供一些指导

更新-仅就自定义用户模型提供一些有用的建议

现在,上面的内容很好,回答了原始问题,但是我向@Kiran承诺,我将为他的自定义用户结构提供一些额外的有用建议。因为在实时环境中,创建名为User的模型并不幸运,因为Django已经有了一个用户模型,因此可能会导致冲突

相反,我们所做的是从AbstractModel类创建我们自己的用户模型,该类利用了Django用户模型的所有优点。最好在一个新的Django项目中尝试并实践整个过程

但在此之前,我们创建了一个用户类型模型,因为最好将用户类型放在一个表中,而不是硬编码到我们的模型或表单中,然后我们可以更轻松地添加或删除用户类型。由于我们希望在自定义用户模型中使用此模型的值进行用户类型选择:

from django.db import models

class userType(models.Model):

    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser

class OurUser(AbstractUser):

    # we get the usertype choice values from the userType table and creating a list of that
    all_user_types = userType.objects.values()
    USER_TYPE_CHOICES = [(d['id'], d['name']) for d in all_user_types]

    chosen_user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES, null=True, verbose_name='User type')
然后,我们只需运行
迁移
,然后继续执行以下步骤:

通过创建自定义用户模型:

from django.db import models

class userType(models.Model):

    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser

class OurUser(AbstractUser):

    # we get the usertype choice values from the userType table and creating a list of that
    all_user_types = userType.objects.values()
    USER_TYPE_CHOICES = [(d['id'], d['name']) for d in all_user_types]

    chosen_user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES, null=True, verbose_name='User type')
然后,我们将根据用户模型创建表单:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import AuthenticationForm
from django import forms
from .models import OurUser

class UserRegistration(UserCreationForm):
    class Meta:
        model = OurUser
        fields = ['username', 'email','chosen_user_type',]
然后我们创建视图进行注册:

from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, HttpResponse, HttpRequest
from django.urls import reverse
from django.views import View
from .models import OurUser
from django.template import loader
from django.contrib.auth import login, authenticate
# from django.contrib.auth.forms import UserCreationForm
from .forms import UserRegistration
from .models import OurUser

def signup(request):
    if request.method == 'POST':
        form = UserRegistration(request.POST)
        if form.is_valid():
            # form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get('email')
            raw_password = form.cleaned_data.get('password1')
            chosen_user_type = form.cleaned_data.get('chosen_user_type')
            newUser = OurUser.objects.create_user(username=username, email=email, password=raw_password, chosen_user_type=chosen_user_type)
            newUser.save()
            # user = authenticate(email=email, password=raw_password) # authenticate not needed here
            login(request, user)
            return HttpResponseRedirect(reverse('myappname:index'))
    else:
        form = UserRegistration()
    return render(request, 'myappname/signup.html', {'form': form})
最后,我们不必忘记在
admin.py

from django.contrib import admin
from .models import OurUser, userType

# Register your models here.
admin.site.register(OurUser)
admin.site.register(userType)
AUTH_USER_MODEL = 'myappname.OurUser'
而且我们也不必忘记在
settings.py

from django.contrib import admin
from .models import OurUser, userType

# Register your models here.
admin.site.register(OurUser)
admin.site.register(userType)
AUTH_USER_MODEL = 'myappname.OurUser'
urls.py
中,我们必须为我们的注册表提供url路径,如:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('signup', views.signup, name='signup'),
]
以及模板文件夹中的
signup.html

{% extends 'myappname/base.html' %}

{% block content %}
  <h2>Sign up</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Sign up</button>
  </form>
{% endblock %}
{%extends'myappname/base.html%}
{%block content%}
注册
{%csrf_令牌%}
{{form.as_p}}
注册
{%endblock%}
最后,我们只需要运行
migrate
,我们应该去我们网站的管理员那里,在userType表中创建一些用户类型,这些用户类型将在我们的自定义注册表中作为选项使用


所以我希望这能让这个问题更清楚。然后我们还必须计算出与我们的用户类型相关的权限等。干杯

user\u type
是用户模型中的一个字段吗?您应该创建一个包含用户选择的列表,然后将此列表存储在模型中的一个
user\u type
字段中。@DanielRoseman是的,非常感谢您花时间解释它!我现在明白了,我相信这对我会有很大帮助的!:)如果我从django的管理页面删除一个用户,它不会反映在数据库表中。我如何修复它?@Kiran-该项目实际上应该从数据库中删除。如果你通过管理员删除。关于这个问题,你能提供更多的信息吗?@Kiran-我又读了一遍你的问题,对它有了更好的理解。我可以想象的问题是,您将模型定义为用户,这对于您的自定义模型来说不是一个幸运的名字,因为Django已经默认了用户表和用户模型,所以这里可能会有一些冲突。请检查一下你的情况,并给我一些反馈。@Kiran-在我的回答中,模型只是一个例子,我不会告诉你