2017-12-05 10 views
1

ユーザーがムービーをクリックしてモデルに保存するときに{012} idパラメータはhtmlテンプレートから来るので、私はmodelFormを使うことができません。助言がありますか?テンプレートから入力値をデータベースに保存する方法[Django]

多分、そのムービーのユーザーIDを取得する別の方法がありますか?

Btw、私は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) # groupping 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 

答えて

1

ここにModelFormは必要ありません。ビューでは、モデルをデータベースに保存するだけでフォームを投稿します。

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

私は、あなたがしなければならないすべてはのModelFormを作成していると思います。それは、これにHTMLで入力項目の名前を変更する前に

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

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

のModelFormを一致させるために、その後のような何かをします。

0

たぶん(私はあなただけのレコードを追加しているという仮定を作ってるんだ)映画のモデルに追加し、別のビューにAjaxの呼び出しを行うためにいくつかのJavaScriptをご紹介します。私があなただったら、私はそのモデルを変更したい:

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がロードされている場合は、データ属性を使用してaタグに設定されたmovieidのようなものを簡単に取得できます。 (https://api.jquery.com/data/参照)。 postメソッドを使用している場合は、おそらくcsrf_tokenが必要になります。 log_click POSTメソッドを受け付けます

$(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のエントリを作成する必要があると思います。詳細については、https://docs.djangoproject.com/en/1.11/topics/http/urls/を参照してください。

+0

、またはそのクラスをリンクの代わりにボタンに配置します。最初に読んだとき、あなたが映画のリンクをクリックしているかどうかを調べようとしていると思っていました。 – AMG

関連する問題