У меня есть класс с атрибутом IntegerField.
В его ModelForm, в поле этого атрибута, мне нужно отправить строку, которая позже будет хранить целое число после его обработки в представлении.
Проблема в том, что Django не позволяет этого, и когда я использую form.cleaned_data.get('myattr'), он говорит, что это неправильно, потому что это должно быть целое число.
class Student(models.Model):
teacher = models.IntegerField(null=False) # I'm saving teacher's key here
class Teacher(models.Model:
name = models.CharField(max_length= 50, null=False)
key = models.IntegerField(null=False)
class StudentForm(forms.ModelForm):
teacher = forms.ModelChoiceField(queryset=Teacher.objects.all(), label='Select the teacher')
Таким образом, когда пользователь выбирает учителя ученика, в этом поле выбора будут отображаться имена доступных учителей. Но в модели он будет хранить свой ключ, которым я управляю в поле зрения.
просмотров.py:
teacher = form.cleaned_data.get('teacher') # it has the name
teacher = Teacher.objects.get(name=teacher).key # getting the key in order to store an Integer, but Django is banning my code before anyway.
Как я могу справиться с этим, не меняя тип данных модели?
Я даже добавил to_field_name в поле формы со значением ключа Учителя.
Потому что я переношу настольное приложение в веб-приложение и мне нужно сохранить структуру таблиц. Работа вещи
Затем убедитесь, что ваша HTML-форма публикует pk как значение (в <option> поля <select> есть видимые значения, для которых вы можете использовать имя, и фактические опубликованные значения, для которых вы должны использовать pk). Если вы используете {{ form.teacher }} в своем шаблоне, это должно сработать.
Что ж, если я проверю элемент, в теге <option> он показывает pk в атрибуте значения и отображает имя. Так как я использовал to_field_name с pk. Я не могу понять, почему представление получает строку из метода публикации.
какую именно ошибку вы получаете? покажите нам свой шаблон, трассировку ошибок и содержимое request.POST. Обратите внимание, что все всегда публикуется как строка, даже целые числа. Они возвращаются к тому, что необходимо, когда поле формы извлекает значение (и очищает его)






Одним из лучших подходов здесь будет установка отношений между вашим учеником и учителем (используя ключ foregin).
В зависимости от потребности вашего приложения вот как это сделать:
Если у одного ученика может быть несколько учителей и у одного учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/
Если у одного ученика может быть только один учитель, но у учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_one/
Если у одного ученика может быть только один учитель, а у одного учителя может быть только один ученик: https://docs.djangoproject.com/en/2.1/topics/db/examples/one_to_one/
Это лучший способ справиться с этим. Затем вам нужно только сопоставить модель Student в форме Student, например:
class StudentForm(forms.ModelForm):
class Meta:
model = Student
#you can add the list of all the fields you want there
fields = ['teacher']
Одним дополнительным шагом будет определение метода улулong> модели, чтобы Django связал строковое представление вашей модели в вашей форме (здесь для удобного способа отображения учителя в форме ученика).
class Teacher(models.Model):
name = models.CharField(max_length= 50, null=False)
#place other fields here ...
def __str__(self):
#if you print a Teacher django will return the string corresponding to the teacher name
return self.name
Я очень ценю ваш ответ. Это полезно, но не в этом случае, поскольку я переношу настольное приложение в веб-приложение, а компания хочет сохранить структуру своих таблиц. Вот почему я пытаюсь управлять этим каким-то другим способом. Если бы я мог просто заставить код игнорировать тип данных...
А что, если вы добавите метаописание Студента в студенческую форму. Затем используйте Select как виджет формы и внутри в этом заполните выбор из запроса к базе данных?
ModelChoiceFieldпредназначен для выбора объекта, на который ссылаетсяForeignKeyв модели. Поэтому ему нуженpk(первичный ключ) экземпляраTeacherв качестве входных данных. Почему бы вам не использоватьForeignKeyдля поляteacher? Вы слишком усложняете свой код так, как делаете это сейчас.