我想通过几个新字段在Django中扩展User模型。之后,我需要创建一个表单,您可以在其中注册用户模型中的用户名+密码以及我的自定义模型中的字段。
这是自定义用户字段的模型:
class Gebruiker(models.Model):
id = models.OneToOneField(User, primary_key=True)
voornaam = models.CharField(max_length=100)
achternaam = models.CharField(max_length=100)
email = models.CharField(max_length=300)
gb_datum = models.DateField()
plaats = models.CharField(max_length=52)
postcode = models.CharField(max_length=6)
huisnummer = models.IntegerField()
nfid = models.IntegerField()
hn_toevoeging = models.CharField(max_length=3, blank=True)
def __str__(self):
return self.voornaam + self.achternaam
这是我对表格的看法。在这种形式中,我还想为Gebruiker模型添加字段,同时保留表单的其余部分。我怎么能这样做?
class UserFormView(View):
form_class = UserForm
template_name = 'home/registration_form.html'
# display blank form
def get(self, request):
form = self.form_class(None)
# form = self.form_class(None)
return render(request, self.template_name, {'form': form})
# process form data
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
user = form.save(commit=False)
#cleaned/normalized data
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user.set_password(password)
user.save()
#returns User objects if credentials are correct
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect('home:index')
return render(request, self.template_name, {'form': form})
我的forms.py:
from django.contrib.auth.models import User
from django import forms
from .models import Gebruiker
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email', 'password']
class GebruikerForm(forms.ModelForm):
class Meta:
model = Gebruiker
fields = ('voornaam', 'achternaam')
答案 0 :(得分:1)
在Post def中执行您为UserForm所做的操作。我会发送GebruikerForm和UserForm来显示表单中的字段以及post初始化用户表单和Gebruikerform并检查验证。
form = self.form_class(request.POST) and
Gform_class = Gebruikerform()
Gform = self.Gform_class(request.POST).
我使用TemplateView来做所有事情,这就是我通常做的事情。