首页 > 解决方案 > 如何将 slug 传递给 UpdateView?

问题描述

我试图让一个 slug 字段通过访问一个UpdateView但是当我单击按钮时它不会重定向或为此做任何事情。

我习惯于使用<int:pk>while 处理UpdateViews,但在这种情况下,我使用的是一个开源应用程序,它使用一个 slug 字段作为它的 URL。

网址:

url(r'^(?P<slug>[\w-]+)/update/$',
    view=QuizUpdateView.as_view(),
    name='quiz_update'),

模型属性和方法:

url = models.SlugField(
    max_length=60,
    blank=False
    )

def get_absolute_url(self):
    return reverse('quiz_detail', kwargs={'pk': self.pk, 'slug': self.url})

模板:

<button class="btn btn-default btn-sm" onclick="location.href='{% url 'quiz_update' slug=quiz.url %}">Update Test</button>

看法:

class QuizUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
    """
    Display a form for updating a quiz

    **Context**

    ``quiz``
        An instance of :model:`quiz.Quiz`

    **Template:**

    :template:`quiz/<slug>/update/`
    """

    model = Quiz
    fields = [
        'title',
        'description',
        'receiver',
        'url',
        'category',
        'max_questions',
        'random_order',
        'answers_at_end',
        'exam_paper',
        'single_attempt',
        'pass_mark',
        'success_text',
        'fail_text',
        'draft',
    ]
    success_message = 'Quiz successfully updated!'

    def test_func(self):
        quiz = self.get_object()
        print(self.request.user.employee_type)
        print(quiz.receiver)
        if self.request.user.employee_type in quiz.receiver:
            return True
        return False

标签: djangopython-3.x

解决方案


类似于您的获取绝对网址方法,您可以如下定义获取更新网址并在模板中调用它

def get_update_url(self):
    return reverse('quiz_update', kwargs={'slug': self.url})

推荐阅读