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'.
То эта форма подходит для редактирования, а не регистрации.
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 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
Подсказать не могу конкретно по коду, но советую начать копать про вывод через связанные модели
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы