Django为URL查询字符串设置书签

时间:2018-11-09 17:42:55

标签: python django

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

models.py

multiDexEnabled true  

forms.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)

为此,我要扩展CreateView并尝试将当前url传递给bookmark.url的初始值。

class BookmarkForm(BootstrapForm, forms.ModelForm):

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

这没什么用,因为我在get_initial()函数中没有GET请求。我可以在哪里存储网址?我考虑过get()函数,但我不知道怎么做。有人可以帮忙吗?预先感谢。

1 个答案:

答案 0 :(得分:2)

  

这没什么用,因为我在get_initial()函数中没有GET请求。

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

因此,您可以使用以下方法生成网址:

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())

但是,以上内容仅会为您提供查询字符串。如果您也对路径感兴趣,则可能要使用request.get_full_path() [Django-doc]

您可能还不想通过form_valid函数将对象保存到数据库,因此首先获取书签,然后设置user,然后将该对象保存到数据库。 / p>

请注意,HiddenInput()是在客户端呈现的,因此可以被篡改。此外,我不认为通过表单设置书签本身是必需的。您可以构建一个视图,例如,通过AJAX调用设置书签,然后使用JavaScript渲染表单以设置名称并提交书签。