【问题标题】:How to get input value from templates and store to database [Django]如何从模板中获取输入值并存储到数据库 [Django]
【发布时间】:2018-05-18 14:24:55
【问题描述】:

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

【问题讨论】:

    标签: python django database sqlite themoviedb-api


    【解决方案1】:

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

    匹配模型形式。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        也许引入一些 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/ 以了解更多信息。

        【讨论】:

        • 或者将该类放在按钮上而不是链接上。在第一次阅读时,我以为您是在尝试查看他们是否在点击电影链接。
        猜你喜欢
        • 2015-11-07
        • 2020-10-29
        • 2014-07-13
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        相关资源
        最近更新 更多