Во время UserCreationForm идентификатор не регистрируется в системе - PullRequest
0 голосов
/ 16 января 2020

Прежде всего, это мой код ошибки: https://imgur.com/0XHUEvz

В моем Django проекте необходимо зарегистрировать учетную запись врача. У каждого доктора есть «больница». Итак, модель доктора имеет больницу в качестве внешнего ключа.

class Doctor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default="")
    name = models.CharField(max_length=50, default='isim')
    gsm = models.CharField(max_length=11)
    address = models.CharField(max_length=200)
    email = models.EmailField()
    title = models.CharField(max_length=20)
    department = models.CharField(max_length=100)
    hospital = models.ForeignKey(Hospitals, on_delete=models.CASCADE)

class Hospitals(models.Model):
    name = models.CharField(max_length=100)
    province = models.ForeignKey(Province, on_delete=models.CASCADE)
    district = models.ForeignKey(District, on_delete=models.CASCADE)
    phone = models.CharField(max_length=15)
    numBeds = models.CharField(max_length=5)
    numRooms = models.CharField(max_length=5)

class UserRegisterForm2(UserCreationForm):
    email = forms.EmailField(label='Email address')
    email2 = forms.EmailField(label='Confirm Email')
    hospital = forms.ChoiceField(
        choices=[(x.id, x.name) for x in Hospitals.objects.all()]
    )

    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'email2',
            'hospital'

        ]

    def clean(self, *args, **kwargs):
        email = self.cleaned_data.get('email')
        email2 = self.cleaned_data.get('email2')
        if email != email2:
            raise forms.ValidationError("Emails must match")
        email_qs = User.objects.filter(email=email)
        if email_qs.exists():
            raise forms.ValidationError(
                "This email has already been registered")
        return super(UserRegisterForm2, self).clean(*args, **kwargs)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'hospital':
            return super().formfield_for_foreignkey(db_field, request, **kwargs)

    def save(self, commit=True):
        instance = super().save(commit=False)
        pk = self.cleaned_data['hospital']
        instance.hospital = Hospitals.objects.get(pk=pk)
        instance.save(commit)
        return instance

Когда я go на странице регистрации, я вижу больницы, зарегистрированные в базе данных. Как будто это его фотография: https://imgur.com/PoQQrlo Но когда я пытаюсь зарегистрироваться после выполнения необходимых частей, я получаю сообщение об ошибке, о котором я вам рассказал. (столбец hospital_id не может быть нулевым) Я думаю, я могу получить названия больниц в базе данных; но я не могу сохранить его идентификатор. Как я могу это сделать?

Заранее спасибо.

Редактировать: Итак, я изменяю ChoiceField на ModelChoiceField следующим образом:

hospital = forms.ModelChoiceField(queryset=Hospitals.objects.all(), initial=0)

Но на этот раз я получаю ошибку, подобную этой:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'ModelBase'

Edit2: я сделал другое изменение.

hospital = forms.ModelChoiceField(queryset = Hospitals.objects.values_list('name', flat=True), to_field_name="id")

Пока все хорошо, я могу зайти на сайт, я могу получить доступ к разделу регистрации: https://imgur.com/icZWtwA Там написано: «Выберите правильный выбор». Что это вообще значит? Я могу показать все свои больницы (только 1 прямо сейчас) и могу выбрать его, но когда я нажимаю кнопку регистрации: снова и снова появляется одна и та же ошибка.

...