簡體   English   中英

如何在 Django 中將基於 function 的視圖集成到基於 class 的視圖中?

[英]How to integrate a function based view into a class based view in Django?

在我的網站中,我有 2 個部分供用戶使用。 用戶發布頁面和個人資料頁面。 個人資料頁面上有他們的所有信息,所以用戶名、描述、名字/姓氏等。用戶帖子頁面上有他們所有的帖子。 但是,我想以某種方式將它們整合在一起。

這是一些代碼。

這是用戶帖子的視圖

class UserPostListView(ListView):
    model = Post
    template_name = 'mainapp/user_posts.html'
    context_object_name = 'posts'

    def get_queryset(self):
        user = get_object_or_404(User,username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-published_date')

如您所見,我正在返回特定用戶的帖子。

現在這是我的個人資料視圖

def view_profile(request,pk=None):
        if pk:
            user_profile = User.objects.get(pk=pk)
        else:
            user_profile = request.user
        context = {'user':user_profile}
        return render(request,'mainapp/profile.html',context)

它返回所有用戶的信息。

這是個人資料和用戶帖子頁面的 HTML 代碼

{% block content %}


<div class="profile-page-container">

    <div class="profile-page-info">
<div class="profile-page-banner">
    <div class="profile-page-banner-background">
        <!-- <img src="https://cdn.pixabay.com/photo/2017/08/30/01/05/milky-way-2695569_960_720.jpg" alt="{{ user }}'s Background Image" > -->
    </div>
    <div class="profile-page-banner-text">
<h2 title="{{ user }}" id="username-profile-page">{{ user|safe|linebreaksbr|truncatechars_html:25 }} {% if user.userprofileinfo.verified %} <span class="image-profile-verified"><img draggable="false" title="Verified User" class="verifed" src="{% static 'images\verified.png' %}" alt="verified" width="25" height="25" srcset=""></span> {% endif %}</h2>

<p>{{ user.first_name }} {{ user.last_name }}</p><br>
</div>
</div>
<div class="profile-page-user-desc-box">
<p>{{ user.userprofileinfo.description }}</p>
<a href="{{ user.userprofileinfo.website }}"><p>{{ user.userprofileinfo.website }}</p></a>
<p>{{ user.userprofileinfo.joined_date |date:"F d Y" }}</p>
</div>
<br>
{% if user.userprofileinfo.image %}
<img class="rounded-circle account-img" src="{{ user.userprofileinfo.image.url }}" alt="{{ user }}'s Profile Picture'">
{% endif %}
</div>
<div class="user-post-user-profile-page">
    <h1 title="{{ user }}">Posts</h1>

{% for post in posts %}
<div class="content">
<div class="post">
        <h1 class='posttitle'>{{ post.title }}</h1>
        <img class="user-image" src="{{ post.author.userprofileinfo.image.url }}" alt="pfp" width="20%" height="20%">
                {% if post.published_date %}
                    <!-- <div class="postdate">
                        <i class="fas fa-calendar-day"></i> &nbsp; <p>Posted {{ post.published_date|timesince }} ago</p>
                    </div>   -->
                    <div class="posted-by">
                        <p>Posted by <strong>{{ post.author }}</strong>  {{ post.published_date|timesince }} ago</p>
                    </div>
                {% else %}
                    <a class="pub-post" href="{% url 'mainapp:post_publish' pk=post.pk %}">Publish</a>
                {% endif %}

              <p class='postcontent' >{{ post.text|safe|linebreaksbr }}</p>
                  </div>
                  </div>
{% endfor %}
</div>
</div>
{% endblock %}

這是 user_posts 頁面

{% block content %}
<div class="sidebar">
        <p class="active" href="#">{{ view.kwargs.username }}</p>
        <button class="commentbtn"><a class="aclass" href="#">Connect with {{ view.kwargs.username }}</a></button>
        <p>{{ user.userprofileinfo.email }}</p>
        <p>Lorem</p>
      </div>


{% for post in posts %}
<div class="content">
<div class="post">
        <h1 class='posttitle'>{{ post.title }}</h1>
        <img class="user-image" src="{{ post.author.userprofileinfo.image.url }}" alt="pfp" width="20%" height="20%">
                {% if post.published_date %}
                    <!-- <div class="postdate">
                        <i class="fas fa-calendar-day"></i> &nbsp; <p>Posted {{ post.published_date|timesince }} ago</p>
                    </div>   -->
                    <div class="posted-by">
                        <p>Posted by <strong>{{ post.author }}</strong>  {{ post.published_date|timesince }} ago</p>
                    </div>
                {% else %}
                    <a class="pub-post" href="{% url 'mainapp:post_publish' pk=post.pk %}">Publish</a>
                {% endif %}

              <p class='postcontent' >{{ post.text|safe|linebreaksbr }}</p>
                  </div>
                  </div>
{% endfor %}
{% endblock %}

我試圖通過將 FBV 剪切並粘貼到 get_queryset 方法下面來將 FBV 合並到 CBV 中所以就像這樣

def get_queryset(self):
    #... code here
def view_profile(request,pk=None):
    #... code here

然而這並沒有奏效。 我只是好奇如何將兩者整合在一起,以便我可以在一個地方擁有兩全其美

編輯:這里是模型




class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,max_length=30)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    description = models.CharField(max_length=150)
    website = models.URLField(max_length=200)
    image = ProcessedImageField(upload_to='profile_pics',
                                           processors=[ResizeToFill(150, 150)],
                                           default='default.jpg',
                                           format='JPEG',
                                           options={'quality': 60})
    joined_date = models.DateTimeField(blank=True,null=True,default=timezone.now)
    verified = models.BooleanField(default=False)


    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

現在是帖子

class Post(models.Model):
    author = models.ForeignKey(User,related_name='posts',on_delete=models.CASCADE)
    title = models.CharField(max_length=75)
    text = models.TextField()
    group = models.ForeignKey(Group,null=True,blank=True,related_name='posts',on_delete=models.CASCADE)
    created_date = models.DateTimeField(default=timezone.now)
    image = models.ImageField(upload_to='post_images',blank=True,null=True)
    file = models.FileField(upload_to='post_files',blank=True,null=True)
    published_date = models.DateTimeField(blank=True,null=True,auto_now_add=True)
    comments_disabled = models.BooleanField(default=False)
    NSFW = models.BooleanField(default=False)
    spoiler = models.BooleanField(default=False)

    tags = TaggableManager()

    def __str__(self):
        return self.title


    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

同樣繼續 Ian 的回答,如果您在模型之間有直接關系,那么您可以像這樣簡單地獲取特定用戶的帖子:

def view_profile(request,pk=None):
        if pk:
            user_profile = User.objects.get(pk=pk)
            user_posts = Posts.objects.filter(user__id=pk)   #<---add these
        else:
            user_profile = request.user
            user_posts = Posts.objects.filter(user__id = request.user.id)   #<---add these
        context = {
                   'user':user_profile,
                   'user_posts':user_posts
                  }
        return render(request,'mainapp/profile.html',context)

一個簡單的基於 class 的視圖,用於獲取用戶:

class UserDetailView(DetailView):
    model = User
    template_name = 'mainapp/profile.html'
    context_object_name = 'user'

關系(外鍵)可以向后跟隨。 每個外鍵都定義了一個反向關系(除非您將reverse_name設置為+ ...),它通常在外鍵引用的 model 上命名為<modelname>_set

例如下面兩行是等價的

Post.objects.filter(author=user)
user.post_set.all()

這可以在您的個人資料模板中使用

{% for post in user.post_set.all %}
    ...
{% endfor %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM