Как сохранить выбранное значение переключателя пользователя после заполнения регистрационной формы в базе данных в django? - PullRequest
0 голосов
/ 25 января 2019

Я создаю страницу регистрации для моего сайта, используя django. Форма регистрации содержит следующие поля: Имя пользователя, E-mail, пароль, подтверждение пароля, user_type. тип_пользователя может быть либо «студент», либо «организация», который имеет тип радио выбора. В зависимости от user_type пользователь может выполнять только те конкретные задачи, которые назначены для этого типа. Поэтому мне нужен способ сохранить их user_type в базе данных, а затем проверить его, чтобы они могли выполнить определенную задачу. Как я могу решить эту проблему?

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 пуст для этого приложения.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Поскольку , выбор этого поля формы будет одним выбранным строковым значением, тогда вы можете просто сохранить его как поле char в вашей модели:

Итак, user_type = models.CharField()

Если ваш выбор выглядит так, как в вашем примере:

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

Однако, вы можете дать целочисленные значения для выбора в вашей форме, например:

choices=(
        (0,'Student'),
        (1,'Organization'),
)

Таким образом, в вашей модели вы сохраните его как user_type = models.IntegerField()

Поскольку у каждого пользователя будет сохранено только одно значение (один выбор), то когда вы вернете значение этого поля обратно, вы просто определите задачи и разрешения в соответствии со значениями с if и else в вашем коде позже.

И если вы создадите эту форму из моделей , то вы можете очень точно определить все это в своих моделях со списком значений выбора и т. Д., Но это не главное в этом вопросе .

Таким образом, ваша модель будет выглядеть так, например:

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})

Конечно, вы можете сохранить это с помощью обычного метода сохранения формы, как вы делали в своем вопросе, я просто не хотел повторять ваш код из вашего вопроса.

Смысл вашего вопроса в том, что вы можете либо сохранить выбранное значение user_type как Charfield, либо вы также можете сохранить выбранное значение как IntegerField в вашей модели. В базе данных это будет только одно значение для каждого пользователя. И тогда вы сможете работать с этим значением позже.

И немного яснее, смысл в том, что вы можете перенаправлять задачи на основе значения user_type любым способом, каким захотите, после того, как это значение в таблице User будет у каждого из ваших зарегистрированных пользователей:

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, что дам несколько дополнительных полезных советов его пользовательской структуре пользователя. Так как в реальной среде не повезло создать модель с именем пользователя, поскольку Django уже имеет модель пользователя и, таким образом, может вызвать конфликт.

Вместо этого мы создаем собственную модель пользователя из класса AbstractModel , которая использует все преимущества пользовательской модели Django. Лучше попробовать все это на практике в новом проекте Django!

Но перед этим мы создаем модель userType , так как лучше иметь user_types в таблице, а не жестко закодировать в нашей модели или форме, тогда позже мы сможем проще добавить или удалить user_types. И так как мы хотим использовать значения этой модели для выбора user_type в нашей пользовательской модели User :

from django.db import models

class userType(models.Model):

    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

Затем мы просто запускаем migrate и затем продолжаем следующие шаги:

С созданием нашей пользовательской модели пользователя :

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)

А также мы не должны забыть определить нашу аутентификацию пользовательской модели пользователя в settings.py

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 %}

И, наконец, нам просто нужно запустить migrate, и мы должны перейти к нашему администратору нашего сайта и создать некоторый тип пользователя в нашей таблице userType , какие типы пользователей будут использоваться в нашей пользовательской форме регистрации как выбор.

Так что я надеюсь, что это проясняет эту тему больше. Затем мы должны выяснить права доступа и так далее, связанные с нашими типами пользователей. Приветствия. ;)

0 голосов
/ 25 января 2019

Во-первых, вам нужно знать, что в поле 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

Теперь вы можете изменить свой form.py в соответствии с ним.

В 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()
            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})

Надеюсь, это поможет.

...