Django метод создания модели - PullRequest
0 голосов
/ 13 июля 2020

Не очень опытен в 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})

Я использую логин, и он работает нормально, поэтому я думаю, что мог бы продолжать работать таким образом, но если кто-то скажет мне лучший способ или что с ним не так, я был бы очень признателен. Заранее спасибо!

...