Прежде всего, это мой код ошибки: 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 прямо сейчас) и могу выбрать его, но когда я нажимаю кнопку регистрации: снова и снова появляется одна и та же ошибка.