使用基于类的视图时,Django URL对我不起作用

时间:2019-05-26 04:05:26

标签: django

我是Django的新手,现在我正在使用Django2.2。 场景是当用户单击菜单上的配置文件选项时,它将带用户进入其用户配置文件

models.py

class UserProfile(auth.models.AbstractUser):
    image = models.ImageField(upload_to=get_image_path,
                              max_length=100,
                              blank=True,
                              null=True,
                              default='account_users/default/profile_image/default.png')

    class Meta:
        verbose_name = "account_user"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

模板

<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu1">
    <li>
        <a href="{% url 'account:user_profile_detail' username=userprofile.username %}" class="btn btn-simple">Profile</a>
    </li>
</ul>

urls.py

urlpatterns = [
    path("profile/<str:username>/", views.UserDetail.as_view(), name="user_profile_detail"),
]

views.py

class UserDetail(DetailView):
    model = models.UserProfile
    template_name = "userprofile_detail.html"

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(
            userprofile__username__iexact=self.kwargs.get("username")
        )

它向我显示以下错误:

/ account / profile / sm10547 /中的

AttributeError 通用详细信息视图UserDetail必须使用URLconf中的对象pk或slug调用。 请求方法:GET 要求网址:http://0.0.0.0:8000/account/profile/sm10547/ Django版本:2.2.1 异常类型:AttributeError 异常值:
通用详细信息视图UserDetail必须使用URLconf中的对象pk或slug调用。 异常位置:get_object,第47行中的/usr/local/lib/python3.7/site-packages/django/views/generic/detail.py Python可执行文件:/ usr / local / bin / python Python版本:3.7.2

  

更新:抱歉,我在这里更新当前情况,现在是结构   是:

models.py

class UserProfile(auth.models.AbstractUser):
    image = models.ImageField(upload_to=get_image_path,
                              max_length=100,
                              blank=True,
                              null=True,
                         default='account_users/default/profile_image/default.png')

    class Meta:
        verbose_name = "account_user"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

模板

<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu1">
    <li>
        <a href="{% url 'account:user_profile_detail' username=userprofile.username %}" class="btn btn-simple">Profile</a>
    </li>
</ul>

url.py

urlpatterns = [
    path("profile/<slug:username>/", views.UserDetail.as_view(), name="user_profile_detail"),
]

view.py

class UserDetail(DetailView):
    model = models.UserProfile
    template_name = "userprofile_detail.html"
    slug_url_kwarg = 'username'

    def get_queryset(self)  :
        queryset = super().get_queryset()
        return queryset.filter(username__iexact=self.kwargs.get("username"))

然后它将引发错误:

Exception Value:    
Cannot resolve keyword 'slug' into field. Choices are: date_joined, email, first_name, groups, id, image, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, posts, user_permissions, username

我真的需要添加子弹字段吗?还是有什么更好的办法来解决这个错误?谢谢大家!

1 个答案:

答案 0 :(得分:0)

抛出此错误是因为它期望一个从属字段或pk字段 在这里更改

class UserDetail(DetailView):
    model = models.UserProfile
    template_name = "userprofile_detail.html"
    slug_url_kwarg = 'username'

在url.py

path("profile/<slug:username>/", views.UserDetail.as_view(), name="user_profile_detail"),

在views.py

return queryset.filter(username__iexact=self.kwargs.get("username"))

更多slug_url_kwarg