【问题标题】:How to use class based view in Django for html button?如何在 Django 中为 html 按钮使用基于类的视图?
【发布时间】:2016-07-28 00:36:20
【问题描述】:

我写了如下视图:

class UserDeleteView(TemplateView):

    template_name = "user/user_delete.html"
    form_class = UserDeleteForm
    model = User

    def delete_my_account(self):
        user = get_user(self.request).user
        if user.is_authenticated():
            logout(self.request)
            user.delete()
            return redirect('/')

1) 如何在user/user_delete.html 中调用该方法?

我认为我的 form_class 属性不是必需的,因为我使用了TemplateView

2) 将UserDeleteView 用于forms.py 的代码看起来如何?如何创建删除按钮?

【问题讨论】:

    标签: python django python-3.x button methods


    【解决方案1】:

    这可能不是您要寻找的答案,但您可以使用 DeleteView 而不是 TemplateView,它只需要一个成功的 url。

    您可以在此处查看其可以使用的默认函数方法:DeleteView

    这里有文档:Django Documentation on DeleteView

    class UserDeleteView(LoginRequiredMixin, DeleteView):
    
        template_name = "user/user_delete.html"
        form_class = UserDeleteForm
        model = User
    
        def get_success_url(self):
            # logout(self.request)
            return redirect('/')
    

    不确定这在删除登录用户的情况下是否可行。我很抱歉,因为我本可以在没有在评论中提供代码的情况下简要提及这一点,但我没有足够的声誉。

    【讨论】:

    • 可以使用 LoginRequiredMixin 代替检查 user.is_authenticated()。从 django.contrib.auth.mixins 导入它并与 DeleteView 一起使用,如class UserDeleteView(LoginRequiredMixin, DeleteView):
    • @user2853437 看看这个:sfm-ui。这个分支有关于如何使用基于类的视图的基本骨架结构。这是我最初在学习时创建的东西。我希望它对你有帮助:)
    【解决方案2】:

    一种方法是这样的

    class UserDeleteView(View):
        def post(self, request, object_id, *args, **kwargs):
            '''retrieve the object for the given object_id and delete it'''
            return redirect(url_to_be_redirected_to)
    

    这对于基本的 Django 视图应该足够了。在您的 HTML 模板中,假设您有一个用于删除对象的按钮,还可以说它的 id 属性设置为 deleteButton。您将不得不使用 javascripting 来启动删除。例如,您的按钮就像

    <a href="delete_url" id="deleteButton">Delete</a>
    

    所以你可以写这样的东西

    $("body").on("click", "a#deleteButton", function(event){
        event.preventDefault();
    
        var url = $(this).attr("href");
        var csrf = fetch_csrf_value_and_assign_here;
        $.post(url, {csrfmiddlewaretoken:csrf}, function(response){});
    });
    

    PS:这是做你想做的事情的最低限度的方法。此外,这不是唯一的方法。但这应该让您从另一个角度来看待您想要实现的目标。

    编辑 1: 我展示的视图的示例 url 配置。

        url(r'delete/(?P<object_id>\d+)/$',
              views.UserDeleteView.as_view(), name='delete-user')
    

    然后在你的 HTML 中,你可以像按钮一样,

    <a href="{% url 'appname:delete-user' object_id_you_want_to_delete %}" id="deleteButton">Delete</a>
    

    您需要在模板中包含要删除的对象的id,我相信您会这样做。

    【讨论】:

    • 您能否在不使用 javascript 的情况下提供另一个灵魂。当然 javascript 很受欢迎,但我想保持平稳。
    • 如果您从我的代码中取出 javascript 并仍然使用我提供的代码,它将起作用。在这种情况下,请求将是一个简单的非 ajax 请求。
    • 对我来说仍然不是那么明显。请求中保存了什么? - 你的代码是'GET'? object_id 中保存了什么?你是说,如果我在我的视图中请求 html-'id',比如 if object_id=='deleteButton' 而不是继续功能?我仍然不明白如何从 html 调用该方法“delete_my_account()”
    • @user2853437 我刚刚对我的回答做了一个编辑部分。我已经为视图提供了一个示例 url 配置。如您所见,object_id 是通过 url 传递的。所以你不必担心 GET/POST 参数。无需与任何 html 标识符进行任何比较。只需搜索如何在 HTML 中使用反向 url。
    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2020-02-29
    • 2018-09-13
    • 1970-01-01
    • 2020-11-06
    • 2020-09-30
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多