#django #http #post #request #query-string
#django #http #Публикация #запрос #строка запроса
Вопрос:
Это мой models.py:
class Blog(models.Model):
user = models.ForeignKey(User)
votes = models.IntegerField(default=0)
class BlogExtended(models.Model):
blog = models.ForeignKey(Blog)
usersVoted = models.ManyToManyField(User)
В принципе, у каждого блога есть пользователь, который создал блог. Если пользователям нравится чей-то блог, они могут проголосовать за него. Каждый раз, когда блог получает голосование, счетчик голосов увеличивается на единицу. В моем шаблоне я не хочу, чтобы кнопка голосования была кнопкой, которая просто говорит «голосовать». Я хочу, чтобы кнопка голосования была изображением. Поскольку, как только пользователь нажимает кнопку голосования, я собираюсь изменить базу данных (увеличив поле «голоса» на единицу) Мне нужно использовать POST-запрос.
Итак, это то, что у меня изначально было для моего шаблона (изначально я использовал GET-запрос):
{% if Blogs %} <!-- Blogs is a list of blogs -->
<ul class="blogs">
{% for blog in Blogs %}
<li>
<a href="/vote/?id={{ blog.id }}" class="vote"><img src="images/voteButton.jpg" </a>
и это было мое мнение, которое обрабатывает URL-адрес /vote/:
def voteView(request):
if request.GET.has_key('id'): #if it is a GET request which has the blogs id
try:
id = request.GET['id']
blog = Blog.objects.get(id=id) #if the Blog is found
blog.votes = 1 #make a change to the 'votes' field in the DB
blog.blogextended_set.usersVoted.add(request.user) #make a change in the 'usersVoted' field in the DB
blog.save()
но, как вы можете видеть, я использовал GET вместо POST . Я понял, что мне нужно использовать POST, поскольку я изменяю базу данных, так что это была моя попытка сделать это POST-запросом:
<form method="post" action="/vote/">{% csrf_token %}
<button type="submit">
<img src="images/voteButton.jpg" alt="vote" />
<!-- I used button rather than input because with button, I was able to replace the button with an image.. I was unable to replace the button with an image -->
</button>
</form>
Эта форма практически не отправляет никакой информации в /vote/ (она отправляет только текущий пользовательский объект: request.user). Мне нужно также отправить идентификатор блога. Я смог отправить идентификатор начальным способом, добавив строку запроса в URL-адрес запроса GET. Единственный способ, который я могу придумать, чтобы добавить идентификатор блога в мой запрос POST, — это добавить строку запроса в URL, чтобы моя форма действовала следующим образом:
<form method="post" action="/vote/?id={{ blog.id }}">
Я понял, что отправка строки запроса с POST-запросом — это то, чего я никогда раньше не видел / не делал. Нормально ли, если я отправляю строку запроса с POST-запросом или это не рекомендуется? Какие проблемы могут возникнуть при отправке строки запроса с POST-запросом?
Дополнительная справка: если это не рекомендуется, может кто-нибудь предложить другой способ отправки дополнительной информации вместе с POST-запросом?
Ответ №1:
Вам просто нужно добавить еще одно поле в вашу форму:
<input type="hidden" name="blog_id" value="{{ blog.id }}" />
целая форма:
<form method="post" action="/vote/">{% csrf_token %}
<button type="submit">
<img src="images/voteButton.jpg" alt="vote" />
</button>
<input type="hidden" name="blog_id" value="{{ blog.id }}" />
</form>
тогда ваше представление должно выглядеть так:
def voteView(request):
if request.POST.has_key('blog_id'):
try:
id = request.POST['blog_id']
...
Ответ №2:
Лучшим решением будет поместить идентификатор блога в скрытое поле в вашей форме, например:
<form method="post" action="/vote/">
{% csrf_token %}
<input type="hidden" name="id" value="{{ blog.id }}">
<button type="submit">
<img src="images/voteButton.jpg" alt="vote" />
</button>
</form>
По вашему мнению, вы сможете извлечь идентификатор сообщения в блоге, за использование которого проголосовали request.POST['id']
.