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