1

当用户点击电影并将其保存到模型时,我正在尝试获取{{ 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 %}

视图.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')

模型.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
4

3 回答 3

3

您在这里不需要 ModelForm。在您发布表单以将模型保存在数据库中的视图中。

if request.method == "POST":
    MovieId.objects.update_or_create(movie_id=request.POST['movie-id'])
于 2017-12-05T03:05:58.570 回答
0

我认为您所要做的就是创建一个 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 }}">

以匹配模型形式。

于 2017-12-05T02:08:02.827 回答
0

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

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

    def __str__(self):
        return self.movie_id

将链接更改为:

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

然后在模板中添加一些 javascript 来观察这些点击。如果你已经加载了 jQuery,你可以使用 data 属性轻松地获得类似在 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 
  });
});

您需要创建一个合适的 urls 条目来处理接受 post 方法的电影:log_click。请参阅https://docs.djangoproject.com/en/1.11/topics/http/urls/以了解此内容。

于 2017-12-05T03:14:20.823 回答