Django为url querystring设置书签

2024-04-18 12:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过一些过滤器(django过滤器)查询Book对象的列表,我要做的是保存我的研究(也就是我的url和GET参数),为用户创建一个书签对象。你知道吗

型号.py

class Bookmark(models.Model):    
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    url = models.URLField(max_length=200)

表单.py

class BookmarkForm(BootstrapForm, forms.ModelForm):

    class Meta:
        model = Bookmark
        fields = ['nome', 'url']
        widgets = {
            'url': forms.HiddenInput()
        }

为此,我扩展了CreateView并尝试将当前url传递给书签.url. 你知道吗

class AddBookmarkView(PermissionRequiredMixin, LoginRequiredMixin, CreateView):
    permission_required = 'core.add_bookmark'
    template_name = 'core/bookmark_form.html'
    model = Bookmark
    form_class = BookmarkForm

    def get_initial(self):
        initial = super().get_initial()
        initial['url'] = request.GET.urlencode()
        return initial

    def get_success_url(self):
        return reverse('elenco_libri')

    def form_valid(self, form):
        bookmark = form.save()
        bookmark.user = self.request.user
        bookmark.save()
        return HttpResponseRedirect(self.get_success_url())

这不会有任何结果,因为我在get\u initial()函数中没有get请求。在哪里可以存储url?我考虑过get()函数,但不知道如何实现。有人能帮忙吗?提前谢谢。你知道吗


Tags: 对象selfformurl过滤器getreturnmodels
1条回答
网友
1楼 · 发布于 2024-04-18 12:40:08

This doesn't get anywhere because I don't have the GET request in get_initial() function.

实际上,基于类的视图中的请求对象是一个属性:self.request。你知道吗

因此,您可以使用以下内容生成URL:

class AddBookmarkView(PermissionRequiredMixin, LoginRequiredMixin, CreateView):
    permission_required = 'core.add_bookmark'
    template_name = 'core/bookmark_form.html'
    model = Bookmark
    form_class = BookmarkForm

    def get_initial(self):
        initial = super().get_initial()
        initial['url'] = self.request.GET.urlencode()
        return initial

    def form_valid(self, form):
        bookmark = form.save(commit=False)
        bookmark.user = self.request.user
        bookmark.save()
        return HttpResponseRedirect(self.get_success_url())

不过,上面的内容只会给你查询字符串。如果您对路径也感兴趣,那么您可能需要使用^{} [Django-doc]。你知道吗

您可能也不想在form_valid函数中将对象保存到数据库中,因此首先获取书签,然后设置user,然后将该对象保存到数据库中。你知道吗

注意,HiddenInput()是在客户端呈现的,因此可以被篡改。此外,我不相信通过表单设置书签本身是必要的。您可以构造一个视图,例如用AJAX调用设置书签,用JavaScript呈现表单以设置名称并提交书签。你知道吗

相关问题 更多 >