如何从模板获取输入值并存储到数据库[Django]

How to get input value from templates and store to database [Django]

我试图在用户点击电影并将其保存到模型时获取 {{ id }}。我不能使用 modelForm,因为 id 参数来自 html 模板。有什么建议吗?

也许有不同的方法来获取该电影用户点击的 ID?

顺便说一句,我正在使用 tmdb api。

{% for id, poster in poster_id_zip %}
    <div style="display: inline-block; margin: 10px;" class="">
      <a href="{{ movie_details }}"><img src="{{ poster }}" alt=""></a>
      <form class="add-movie-form" method="POST">
        {% csrf_token %}
        <input type="hidden" name="movie-id" value="{{ id }}">
        <button style="display: block; margin: 5px auto 0 auto;" type="submit" name="add">Add</button>
      </form>
    </div>
{% endfor %}

views.py

def index(request):
    api_key = "api_key"
    image_base_url = "https://image.tmdb.org/t/p/"
    if request.method == "POST":
        user_query = request.POST.get('search-box', ' ')
        if user_query == '':
            user_query = ' '

        search_movies_url = "https://api.themoviedb.org/3/search/movie?api_key={}&query={}".format(api_key, user_query)

        search_results_data = requests.get(search_movies_url)

        total_results = search_results_data.json().get("total_results") # for handling no search results

        movie_ids, poster_path, poster_full_url = [], [], []

        for movie in search_results_data.json().get("results"):
            movie_ids.append(movie.get("id"))
            poster_path.append(movie.get("poster_path"))

        for poster in poster_path:
            poster_full_url.append(image_base_url+"{}{}".format("w185", poster))

        movie_details = "https://api.themoviedb.org/3/movie/{}?api_key={}".format(movie_ids, api_key)

        poster_id_zip = zip(movie_ids, poster_full_url) # grouping ids with poster images

        context = {"movie_ids": movie_ids, "poster_url": poster_full_url, "movie_details": movie_details, "poster_id_zip": poster_id_zip, "total_results": total_results,}

        return render(request, 'homepage/movies.html', context)
    return render(request, 'homepage/index.html')

models.py

from django.db import models

# Create your models here.

class MovieId(models.Model):
    movie_id = models.IntegerField()
    def __str__(self):
        return self.movie_id

我想您所要做的就是创建一个 ModelForm。然后做类似的事情:

movie_form = MovieModelForm(request.POST)
if movie_form.is_valid():
    movie_form.save() # to save the object

在此之前将 HTML 中的输入项名称更改为:

<input type="hidden" name="movie_id" value="{{ id }}">

以匹配模型形式。

此处不需要 ModelForm。在视图中,您 post 仅将模型保存在数据库中的表单。

if request.method == "POST":
    MovieId.objects.update_or_create(movie_id=request.POST['movie-id'])

也许可以引入一些 javascript 来调用 ajax 另一个添加到 Movie 模型的视图(我假设您只是添加一条记录)。如果我是你,我会将该模型更改为:

class MovieLinkClick(models.Model):
    movie_id = models.IntegerField()

    def __str__(self):
        return self.movie_id

将 link 更改为:

<a href="{{ movie_details }}" data-movieid={{id}} class="movielink"><img src="{{ poster }}" alt=""></a>

然后在模板中添加一些 javascript 以观察这些点击。如果您已经加载了 jQuery,您可以使用数据属性轻松获得类似于 a 标签中设置的 movieid 之类的内容。 (参见 https://api.jquery.com/data/)。如果您使用 post 方法,您可能还需要 csrf_token。

$(document).ready(function() {
  $('.movielink').on("click", function(e) {
    e.preventDefault();
    var link = $(this).attr("href");
    var id = $(this).data('movieid');
    $.ajax({
           url: "{% url 'movies:log_click' %}",
           type: "POST",
           data: {movie_id: id, csrfmiddlewaretoken: "{{ csrf_token }}" });
    window.location.href = link;  //redirect to the href 
  });
});

您需要创建一个合适的 url 条目来处理接受 post 方法的 movies:log_click。请参阅 https://docs.djangoproject.com/en/1.11/topics/http/urls/ 以了解相关信息。