【问题标题】:How can I load a class based view by slug?如何通过 slug 加载基于类的视图?
【发布时间】:2017-12-15 15:36:06
【问题描述】:

我创建了一个视图来编辑用户:

class UsersEditView(UpdateView):
    model = User
    fields = ['first_name', 'last_name', 'email', 'password']
    success_url = reverse('user-list')

编辑此模型:

class User(AbstractUser):
    email = EmailField(unique=True)
    slug = AutoSlugField(populate_from='email', max_length=10, unique=True)
    REQUIRED_FIELDS = []
    USERNAME_FIELD = 'email'

我是这样定义网址的:

urlpatterns = [
    path('', UsersListView.as_view(), name='user-list'),
    path('new/', UsersCreateView.as_view(), name='user-new'),
    path('edit/<str:slug>/', UsersEditView.as_view(), name='user-edit')
]

我这样测试它:

class EditUserTest(AbstractTest):

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        user = User(email='email@provider', first_name='Test', last_name='User', slug='slug', password='qqq')
        user.save()

    def test_edit_user(self):
        response = EditUserTest.client.get(reverse('user-edit', args=('slug', )))

除了响应总是 404:

ipdb> response.status_code
404

那么,我错过了什么?

这是为 Django 2.0 准备的。

【问题讨论】:

  • 您不应该在setUpClass 中创建用户。它应该进入setUp,因为它需要在每个测试用例中运行一次。您应该在测试方法本身中使用self.client

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


【解决方案1】:

你需要通过

kwargs={'slug': 'slug'} 而不是args=('slug', )

【讨论】:

  • 还是 404:response = EditUserTest.client.get(reverse('user-edit', kwargs={'slug': 'slug'}))
猜你喜欢
  • 2019-03-12
  • 2019-04-19
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
相关资源
最近更新 更多