Как настроить форму создания пользователя, которая позволяет менеджерам создавать учетные записи для сотрудников? - PullRequest
0 голосов
/ 21 декабря 2018

Итак, я расширил свою пользовательскую модель с помощью OneToOneField.Моя цель - предоставить пользователю типа «Менеджер» возможность создавать пользователей-сотрудников.

Одна из главных проблем, с которыми я сталкиваюсь, - это заполнение поля внешнего ключа пивоваренного завода.По какой-то причине, каждый раз, когда я отправляю форму с выбранным пивоваренным заводом, я получаю «Невозможно вставить значение NULL в столбец« brewery_id »», даже если был выбран brewery_id.Однако пользователь все еще создается, но не расширенная клиентская часть.

В идеале я бы хотел, чтобы brewery_id заполнялся для нового пользователя на основе менеджера, который его создает.

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

models.py:

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    brewery = models.ForeignKey(Brewery, models.DO_NOTHING)
    phone_number = models.CharField(max_length=20)
    phone_carrier = models.CharField(max_length=80)
    role = models.CharField(max_length=60)

    class Meta:
        managed = True

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Customer.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.customer.save()

forms.py:

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

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

class CustomerForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ('brewery', 'phone_number', 'phone_carrier', 'role')

views.py:

@login_required
def adminsite_register(request):
    if request.method == 'POST':
        user_form = UserRegisterForm(request.POST)
        cust_form = CustomerForm(request.POST)
        if user_form.is_valid() and cust_form.is_valid():
            user_form.save()
            cust_form.save()
            messages.success(request, f'Account has been created! You can now log in.')
            return redirect('index')
        else:
            messages.error(request, f'Please correct the errors.')
    else:
        user_form = UserRegisterForm(request.POST)
        cust_form = CustomerForm(request.POST)
    return render(request, "AdminSite/adminControls.html", {'user_form': user_form, 'cust_form': cust_form})

1 Ответ

0 голосов
/ 21 декабря 2018

Я думаю, что проблема в этой строке в вашем приемнике сигнала:

if created:
    Customer.objects.create(user=instance)

Это пытается создать Customer без указания Brewery и вызовет ошибку.

Кажется, что ваша причина для использования приемников сигнала состоит в том, чтобы связать User с Customer.Это может быть проще сделать в виде, таком как это:

@login_required
def adminsite_register(request):
    ...
    if user_form.is_valid() and cust_form.is_valid():
        user = user_form.save()
        customer = cust_form.save(commit=False)  # Don't commit the customer just yet
        customer.user = user  # Associate the user
        customer.save()  # Now save the customer
        ...

, а затем полностью удалить приемники сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...