У меня есть класс с атрибутом 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
? Вы слишком усложняете свой код так, как делаете это сейчас.