Не очень опытен в Django, и у меня возникли проблемы при создании формы для модели, которая имела OneToOneField с моделью User Django.
models.py С моделью, которую я создал с чем-то random и User
class Account(models.Model):
user_acc = models.OneToOneField(User, on_delete=models.CASCADE)
date_joined = models.DateField(...)
random_text = models.CharField(...)
forms.py
: Я потратил много времени, выясняя, как правильно создавать формы для этого, и лучшее, что я нашел, - это создать 2 формы и использовать их в view (Что я сделал, и он выполняет свою работу, но я не уверен, что это лучшее решение
class RegisterUserForm(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email", "password"]
widgets = {
'username': forms.TextInput(attrs={'class': "form-control col-4", 'placeholder': "Username"}),
'email': forms.EmailInput(attrs={'class': "form-control col-4", 'placeholder': "Email"}),
'password': forms.PasswordInput(attrs={'class': 'form-control col-4', 'placeholder': "Password"})
}
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email__iexact=email).exists():
raise ValidationError('Account with this email already exists')
else:
return email
class AccountForm(forms.ModelForm):
class Meta:
model = Account
fields = ["random_text"]
widgets = {
"random_text": forms.TextInput(attrs={'class': "form-control col-4", 'placeholder': "Random text"})
}
И теперь у меня есть представление, в котором я помещаю 2 формы и когда я использую метод POST Сначала я создаю объект User, а затем создаю Account при передаче User. Он выполняет свою работу, но кажется, что это не лучший способ.
views.py:
def register(request):
if request.method == "POST":
user_form = RegisterUserForm(data=request.POST)
acc_form = AccountForm(data=request.POST)
if acc_form.is_valid() and user_form.is_valid():
username = user_form.cleaned_data['username']
password = user_form.cleaned_data['password']
email = user_form.cleaned_data['email']
random_text = acc_form.cleaned_data['random_text']
user = User.objects.create_user(username=username, password=password, email=email)
user = authenticate(username=username, password=password)
account = Account.objects.create(random_text=random_text, user_acc=user)
else:
print("ERRORS {}".format(user_form.errors))
user_form = RegisterUserForm
acc_form = AccountForm
return render(request, 'acc/register.html', {"user_form": user_form, "acc_form": acc_form})
Я использую логин, и он работает нормально, поэтому я думаю, что мог бы продолжать работать таким образом, но если кто-то скажет мне лучший способ или что с ним не так, я был бы очень признателен. Заранее спасибо!