如何在Django中为页面添加书签?

时间:2019-03-27 18:28:14

标签: django python-3.x django-models django-forms django-views

我正在尝试编辑html页面,以便已登录的用户可以对video.id进行收藏/添加书签

这是 .html 文件

<td>
    <form method='POST' action="{% url 'researcher_view_app:favourite_post' video.id %}">
        {% csrf_token %}
        <input type='hidden' name='video' value={{ video.id }}>
        <button type='submit'>Bookmark</button>
    </form>
</td>

这是 urls.py 文件

path('<int:fav_id>/favourite_post', views.favourite_post, name='favourite_post'),

这是 view.py 文件

def favourite_post(request, fav_id):
    video = get_object_or_404(Video, id=fav_id)
    if request.method == 'POST':
        video.

   return render(request, 'researcher_view_app/%s' % fav_id)

1 个答案:

答案 0 :(得分:1)

  • 首先,您修改具有用户模型的 models.py
class ProjectUser(AbstractUser):
    images = models.ManyToManyField(Images)

    def __str__(self):
        return self.email
  • .html文件中添加以下内容:
{% for image in available_images %}
/* show image */
<form method='post' action="{% url 'user-image-add' %}">
 {% csrf_token %}
 <input type='hidden' name='image' value={{image.id}}>
 <button type='submit'>bookmark</button>
</form>
{% endfor %}
  • 在您的 views.py 中添加以下方法
def user_image_add(request):
    user_image_form = ImageForm(request.POST or None)
    if request.method == 'POST' and user_image_form.is_valid(): 
         request.user.images.add(user_image_form.cleaned_data['image'])
         return JsonResponse(status=200)
    raise Http404()
  • 在添加的文件中创建一个 forms.py 文件,并添加以下内容:
class ImageForm(forms.Form):
    image = forms.ModelChoiceField(queryset=Images.objects.all())

要显示这些带有书签的图像,您可以像上面的代码一样在request.user.images上进行迭代(它会为您提供图像的QS)。


  • urls.py 中添加以下内容:

path('user-image-add/', views.user_image_add, 'user-image-add')

  • 在models.py中,在用户模型中添加一种方法,如果视频被添加了书签,则该布尔值会被获取
def is_bookmarked(self, video_id): 
    return self.bookmarked_videos.filter(id=video_id).exists()

可以将is_bookmarked类似地添加到接受user_id并选中video.projectuser_set的视频模型中。

并将以下内容添加到您的.html文件中,用户在其中添加了视频书签

`{% if video.is_bookmarked %}`

  • 删除UserProfile,因为您不需要它。只需确保在视图上下文中具有所需的实例即可。