Обновить форму Django
У меня есть двухстраничный сайт, который отображает таблицу из БД. Сайт позволяет добавить информацию о сотруднике и обновить некоторые поля. Я столкнулся с проблемой, что когда хочу обновить поле с всплывающим списком "Департамент" (данноe поле является ForeignKey), выкидывает ошибку ValueError (Cannot assign "'Департамент сервиса'": "Employee.department" must be a "Department" instance.).
views.py
def edit_department(request, id):
try:
dep = Department.objects.all()
if request.method == "POST":
dep = Employee.objects.get(id=id)
dep.department= request.POST.get("department")
dep.save()
return redirect("base")
else:
return render(request, "manager_employees/edit_department.html", {'dep': dep})
except Employee.DoesNotExist:
return HttpResponseNotFound("<h2>Person not found</h2>")
models.py
class Employee(models.Model):
name = models.CharField(max_length=50, verbose_name="ФИО")
date_of_start = models.DateField(verbose_name="Дата оформления")
position = models.ForeignKey("Position", on_delete=models.PROTECT, verbose_name="Должность")
department = models.ForeignKey("Department", on_delete=models.PROTECT, verbose_name="Подразделение")
class Department(models.Model):
department = models.CharField(verbose_name="Наименование департамента", max_length=50, db_index=True)
template.py
<form method="POST">
{% csrf_token %}
<p>
<label>Введите отдел</label><br>
<select name='department'>
{% for key in dep %}
<option value="{{ key }}">{{ key }}</option>
{% endfor %}
</select>
</p>
<input type="submit" value="Сохранить" >
</form>
Возможно ли в данной ситуации как то исправить данную проблему?
Ответы (1 шт):
логично. Employee.department - это ключ, а вы пытаетесь ему присвоить строку из POST. Для начала вам надо получить объект department и его уже присваивать. Т.е. как-то так:
if request.method == "POST":
dep = Employee.objects.get(id=id)
instance = get_object_or_404(Department, department=request.POST.get("department"))
dep.department= instance
dep.save()
return redirect("base")
Код не проверен, но должно быть примерно так.
И по вашему шаблону. Искать по тексту это немного моветон. Рано или поздно встретится модель, где будет несколько записей с одним текстом. Старайтесь использовать id в передаваемых параметрах
<select name='department'>
{% for key in dep %}
<option value="{{ key.id }}">{{ key.department }}</option>
{% endfor %}
</select>

