Nikolino
@Nikolino

Как вывести форму регистрации с дополнительными полями?

Есть модель, расширяющая стандартную User модель:
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    producer_name = models.CharField(max_length=100, verbose_name="Producer name", blank=True)


Есть форма:
class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email', 'password']


Как в эту или другую форму добавить поле producer_name, так чтобы при регистрации помимо стандартных полей, было еще и дополнительное?

Попробовал так:
def register2(request):
    FormSet = inlineformset_factory(User, Profile, fields=('producer_name', 'username'))
    if request.method == "POST":
        formset = FormSet(request.POST)
        if formset.is_valid():
            pass
    else:
        formset = inlineformset_factory(User, Profile, fields=('producer_name', 'username'))
    return render(request, 'blog/register-second.html', {'formset': formset})


Ругается при выводе формы:
Unknown field(s) (username) specified for Profile

Если убрать 'username', то форму выводит, но только можно менять 'producer_name'.
То эта форма подходит для редактирования, а не регистрации.
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 3
Konstantin18ko
@Konstantin18ko
Стоматолог
Две формы:
userForm
formProfile

userForm.as_p
formProfile.as_p

И когда принимаете формы сохраняете по очереди:
userForm.is_valid()
formProfile.is_valid()

P.S. У меня сделано через абстрактную модель.
Ответ написан
Комментировать
@AlexandrBirukov
Мой пример, должен помочь

models.py:
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    is_client = models.BooleanField("Статус клиента", default=False)


class Client(models.Model):
    """Профиль клиентов"""

    user = models.OneToOneField(User,
                                on_delete=models.CASCADE,
                                primary_key=True)
    entity = models.CharField("Организация", max_length=255, blank=True)
    address = models.TextField("Адрес организации", blank=True)
    mode = models.CharField("Режим работы", max_length=255, blank=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta():
        verbose_name = "Профиль клиента"
        verbose_name_plural = "Профили клиентов"
        ordering = ["-created"]

    def __str__(self):
        return self.name


forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.db import transaction
from main.models import Client, User

class ClientCreationForm(UserCreationForm):
    entity = forms.CharField(required=False, label='Организация')
    address = forms.CharField(required=False, widget=forms.Textarea, label='Адрес')
    mode = forms.CharField(required=False, label='График работы')

    class Meta(UserCreationForm.Meta):
        model = User

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_client = True
        user.save()
        Client.objects.create(user=user,
                              entity=self.cleaned_data.get('entity'),
                              address=self.cleaned_data.get('address'),
                              mode=self.cleaned_data.get('mode'))
        return user


+ в settings.py нужно обязательно переопределить AUTH_USER_MODEL на свою и для отображения в админке новой модели пользователя что-то типа такого надо сделать:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm
from .models import User


class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = User


class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

    fieldsets = UserAdmin.fieldsets + (
        ('Статус', {'fields': ('is_client', )}),
    )

admin.site.register(User, MyUserAdmin)
Ответ написан
Комментировать
@ma3xak
Подсказать не могу конкретно по коду, но советую начать копать про вывод через связанные модели
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы