如何从模板获取输入值并存储到数据库[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/ 以了解相关信息。
我试图在用户点击电影并将其保存到模型时获取 {{ 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/ 以了解相关信息。