【问题标题】:Using DetailView to view UserProfiles in Django在 Django 中使用 DetailView 查看 UserProfiles
【发布时间】:2018-09-07 03:50:19
【问题描述】:

我需要有关简单博客网站的帮助。用户可以在哪里写帖子。每个帖子作者都必须登录才能撰写帖子。但读者不必登录。

我正在使用 django DetailView 来允许读者查看帖子作者的个人资料。

个人资料视图将包含作者的详细信息以及作者撰写的其他帖子。

我使用以下逻辑来制作视图 https://chriskief.com/2012/12/29/django-generic-detailview-without-a-pk-or-slug/

以下是详细信息:

所有这些都在我网站的帐户应用程序中。下面的代码被破坏并给出错误

Image of the Error Message

accounts/views.py:

    class ProfileView(DetailView):
            model = User
            template_name = 'accounts/profile.html'

            def get_user_profile(self, username):   
                return get_object_or_404(User, pk=username)
     #I know pk=username is not correct. I am not sure what to put pk=?

  # I was able to get the writers other posts using the code below. I did not have to show this code for this question. But just to show you that the pk above has to be username. Or Else the code below won't work(I guess)        
            def get_context_data(self, **kwargs):
                context = super(ProfileView, self).get_context_data(**kwargs)
                context['post_list'] = Post.objects.filter(user__username__iexact=self.kwargs.get('username'))
                return context  

我的模型如下

accounts/models.py:

from django.contrib.auth.models import User
from django.db import models

    class UserProfile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        city = models.CharField(max_length=100)
        country = models.CharField(max_length=100)
        bio = models.TextField(default='', blank=True)
        profile_image = models.ImageField(default='', blank=True, null='')


        def __str__(self):
            return "Profile of {}".format(self.user.username)

下面是我的模板

    {% extends 'base.html' %}

    {% block body %}
    <div class="content">
        <h1>{{user.first_name}} {{user.last_name}}</h1>
        <p>            
            <br/>From: City, Country
            <br/>Bio
            <br/>Profile Image
        </p>
    </div>


    {% endblock %}

accounts/urls.py

from django.conf.urls import url
from . import views
from django.contrib.auth.views import LoginView, LogoutView

app_name = 'accounts'

urlpatterns = [
    url(r'^login/$', LoginView.as_view(template_name='accounts/login.html'), name='login'),
    url(r'^logout/$', LogoutView.as_view(), name='logout'),
    url(r'^signup/$', views.SignUp.as_view(), name='signup'),
    url(r'^profile/(?P<username>[-\w]+)/$', views.ProfileView.as_view(), name='profile'),

]

错误消息文本

/accounts/profile/3/ 处的 AttributeError 必须使用对象 pk 或 slug 调用通用详细视图 ProfileView。 请求方法:GET 请求网址:http://127.0.0.1:8000/accounts/profile/3/ Django 版本:1.11 异常类型:属性错误 异常值:
必须使用对象 pk 或 slug 调用通用详细视图 ProfileView。 异常位置:C:\Users\Samir\Miniconda3\envs\MyDjangoEnv\lib\site-packages\django-1.11-py3.6.egg\django\views\generic\detail.py 在 get_object,第 49 行 Python 可执行文件:C:\Users\Samir\Miniconda3\envs\MyDjangoEnv\python.exe Python版本:3.6.4 Python 路径:…………

【问题讨论】:

  • 你的问题是什么?
  • def get_user_profile(self, username): return get_object_or_404(User, pk=username) 上面的代码不起作用 pk = username is not correct
  • 你确定要DetailView吗? DetailView 用于显示单个对象的详细信息。您要显示的对象是什么?在get_user_profile方法中,可以通过self.request.user获取登录/匿名用户。
  • 我绝对愿意改变这一点如果有替代方案下面是我得到这个想法的地方:chriskief.com/2012/12/29/…
  • 如果你是 Django 新手,请使用 FunctionBasedViews 而不是 ClassBasedViews

标签: django django-views


【解决方案1】:

如果您使用“用户名”字段来获取用户,您可能需要 更改过滤器以使用“用户名”字段,因为它是唯一的:

尝试更改功能:

def get_user_profile(self, username):   
    return get_object_or_404(User, pk=username)

def get_object(self):
    return get_object_or_404(User, username=self.kwargs.get('username'))

如果您希望对象成为 UserProfile,则将其稍微更改为

def get_object(self):
        return get_object_or_404(UserProfile, user__username=self.kwargs['username'])

【讨论】:

  • 这是我做的第一件事我得到了如上图所示的图像
  • 哪张图片?您在哪里使用了“get_user_profile”功能。参数“用户名”(str)的内容是什么?
  • 我使用下面的逻辑来制作视图chriskief.com/2012/12/29/…
  • 点击链接:错误信息的图片
  • 如果您希望对象为UserProfile,则将其稍微更改为get_object_or_404(UserProfile, user__username=self.kwargs['username'])
猜你喜欢
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2012-03-13
  • 2015-08-25
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多