Проблемы с сохранением объекта с внешним ключом в Django
Это мой первый вопрос на форуме.
Я новичок в Django и медленно продвигаюсь вперед. Код, над которым я работаю, теперь выбрасывает ошибку при сохранении с объектом в качестве внешней ключевой ссылки.
Вот мои модели:
# models.py
class Make(models.Model):
name_text = models.CharField(max_length=100)
def __str__(self):
return self.name_text
class Autos(models.Model):
nickname = models.CharField(max_length=100)
make = models.ForeignKey(Make, on_delete=CASCADE)
milage = models.IntegerField(default=0)
comments = models.CharField(max_length=1000)
HTML форма, которая отправляет данные в представление
<form action="{% url 'auto:addauto' %}" method="post">
{% csrf_token %}
<p>
<label for="nickname">Nickname : </label>
<input type="text" name="nickname" id="nickname" value="{{ autodetails.nickname }}">
</p>
<p>
<label for="make">Make : </label>
<select name="make" id="make">
{% for item in make %}
<option value="{{ item.name_text }} ">{{ item }}</option>
{% endfor %}
</select>
</p>
<p>
<label for="milage">Milage : </label>
<input type="text" name="milage" id="milage" value="{{ autodetails.milage }}">
</p>
<p>
<label for="comments">Comments : </label>
<input type="textarea" name="comments" id="comments" value="{{ autodetails.comments }}">
</p>
<input type="submit" name = "buttonsubmit" value="Add">
</form>
Посмотрите, где существует проблема:
# views.py
def addauto(request):
if request.method == 'POST':
obj = Autos()
obj.nickname = request.POST['nickname']
name_text1 = request.POST.get('make')
make = Make.objects.get(name_text = name_text1)
obj.make = make
obj.milage = request.POST['milage']
obj.comments = request.POST['comments']
obj.save()
return redirect('/autos/listautos')
else:
make = Make.objects.all()
context = {
'make': make
}
return render(request, 'autos/add_auto.html', context)
Приведенный выше код работает с:
make = Make.objects.filter(name_text = "some value")
Я также попробовал следующий код, но безуспешно:
name_text1 = request.POST.get('make')
make = Make.objects.filter(name_text = name_text1)
obj.make = make
Для objects.get()
вот трассировка ошибки:
internal Server Error: /autos/addauto
Traceback (most recent call last):
File "/home/harsha/Projects/django3/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/harsha/Projects/django3/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/harsha/Projects/django-projects/mysite/autos/views.py", line 22, in addauto
make = Make.objects.get(name_text = name_text1)
File "/home/harsha/Projects/django3/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/harsha/Projects/django3/lib/python3.8/site-packages/django/db/models/query.py", line 435, in get
raise self.model.DoesNotExist(
autos.models.Make.DoesNotExist: Make matching query does not exist.
Я попробовал все, что мог придумать, основываясь на моих текущих знаниях - похоже, я не вижу проблемы. Любая помощь будет оценена по достоинству.
Я смог решить проблему, и ниже приведено мое исправление.
I was passing "item.name_text" instead of "item.id" for the "value" of the dropdown
<p>
<label for="make">Make : </label>
<select name="make" id="make">
{% for item in make %}
**<option value="{{ item.id }} ">{{ item }}</option>**
{% endfor %}
</select>
</p>
Обновленный вид с ниже
make = Make.objects.get(pk = request.POST.get('make'))
obj.make = make