Django / HTTP — отправка строки запроса с POST-запросом — не рекомендуется?

#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'] .