【问题标题】:Django Template Query Set and filtersDjango 模板查询集和过滤器
【发布时间】:2020-10-22 00:33:20
【问题描述】:

在我看来,我有一个模型,它返回具有用户外键的模型的所有实例。此视图呈现一个配置文件页面,其中 model.user 与 request.user 进行检查,如果匹配,它将在配置文件页面上打印出该模型的信息。

这是我的观点。:

@login_required(login_url='loginpage_company')
@allowed_users_company(allowed_roles=['company'])
def profile_company(request):
print(request.user)
companies = Company.objects.all()

responses = Response.objects.all()

context = {
    'companies': companies,
    #'company_reviews': company_reviews,
    #'total_reviews': total_reviews,
    'responses': responses,
    'info': "No company claimed yet",
    'infor': 'Not Available',
       
    
}
return render(request, 'companyusers/profile_company.html', context)

对于我的模型,我有以下内容。

class Company(models.Model):
Online_Merchant = 'merch'
Education = 'edu'
Transportation = 'trans'
Hospitalism = 'hosp'
Healthcare = 'health'
Construction = 'const'
Blog = 'blog'
Finance = 'fin'
Media = 'media'
Government_Agency = 'agency'
Other = 'other'
Manufacturing = 'manufacturing'
sector = [
    (Online_Merchant, 'Online Merchant'),
    (Education, 'Education'),
    (Transportation, 'Transportation'),
    (Hospitalism, 'Hospitalism'),
    (Healthcare, 'Healthcare'),
    (Construction, 'Construction'),
    (Blog, 'Blog'),
    (Finance, 'Finance'),
    (Media, 'Media'),
    (Manufacturing, 'Manufacturing'),
    (Government_Agency, 'Government Agency'),
    (Other, 'Other')
]
Free = 'Free'
Premium = 'Premium'
package = [
    (Free, 'Free'),
    (Premium, 'Premium')
]
Abuja = 'Abuja'
Abia = 'Abia'
Adamawa = 'Adamawa'
Akwa_Ibom = 'Akwa Ibom'
Anambra = 'Anambra'
Bauchi = 'Bauchi'
Bayelsa = 'Bayelsa'
Benue = 'Benue'
Borno = 'Borno'
Cross_River = 'Cross River'
Delta = 'Delta'
Ebonyi = 'Ebonyi'
Edo = 'Edo'
Ekiti = 'Ekiti'
Enugu = 'Enugu'
Gombe = 'Gombe'
Imo = 'Imo'
Jigawa = 'Jigawa'
Kaduna = 'Kaduna'
Kano = 'Kano'
Katsina = 'Katsina'
Kebbi = 'Kebbi'
Kogi = 'Kogi'
Kwara = 'Kwara'
Lagos = 'Lagos'
Nasarawa = 'Nasarawa'
Niger = 'Niger'
Ogun = 'Ogun'
Ondo = 'Ondo'
Osun = 'Osun'
Oyo = 'Ibadan'
Plateau = 'Plateau'
Rivers = 'Rivers'
Sokoto = 'Sokoto'
Taraba = 'Taraba'
Yobe = 'Yobe'
Zamfara = 'Zamfara'

state = [
    (Abuja, 'Abuja'),
    (Abia, 'Abia'), 
    (Adamawa, 'Adamawa'),   
    (Akwa_Ibom, 'Akwa Ibom'),
    (Anambra, 'Anambra'),
    (Bauchi, 'Bauchi'),
    (Bayelsa, 'Bayelsa'),
    (Benue, 'Benue'),
    (Borno, 'Borno'),
    (Cross_River, 'Cross River'),
    (Delta, 'Delta'),
    (Ebonyi, 'Ebonyi'),
    (Edo, 'Edo'),
    (Ekiti, 'Ekiti'),
    (Enugu, 'Enugu'),
    (Gombe, 'Gombe'),
    (Imo, 'Imo'),
    (Jigawa, 'Jigawa'),
    (Kaduna, 'Kaduna'),
    (Kano, 'Kano'),
    (Katsina, 'Katsina'),
    (Kebbi, 'Kebbi'),
    (Kogi, 'Kogi'),
    (Kwara, 'Kwara'),
    (Lagos, 'Lagos'),
    (Nasarawa, 'Nasarawa'),
    (Niger, 'Niger'),
    (Ogun, 'Ogun'),
    (Ondo, 'Ondo'),
    (Osun, 'Osun'),
    (Oyo, 'Ibadan'),
    (Plateau, 'Plateau'),
    (Rivers, 'Rivers'),
    (Sokoto, 'Sokoto'),
    (Taraba, 'Taraba'),
    (Yobe, 'Yobe'),
    (Zamfara, 'Zamfara')
]

user = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='Company User')
company_sector = models.CharField(max_length=30, choices=sector, default=Online_Merchant)
company_name = models.CharField(max_length=100)
company_description = models.TextField()
company_logo = models.ImageField(upload_to='company_logos', blank=True, null=True)
company_state = models.CharField(max_length=30, choices=state, default=Lagos)
company_address = models.TextField(max_length=2000)
average_rating = models.IntegerField(default=0)
total_views = models.IntegerField(default=0)
company_website = models.CharField(max_length=500, blank=True, null=True)
company_email = models.EmailField(max_length=500, blank=True, null=True)
company_phone = models.CharField(max_length=500)
package_chosen = models.CharField(max_length=8, choices=package, default=Free)
featured = models.BooleanField(default=False)
advert = models.BooleanField(default=False)
premium = models.BooleanField(default=False)

def __str__(self):
    return self.company_name

这是我在模板中的内容:

{% extends 'base.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% include "nav_bar.html" %}

{% block greeting %}                        
    <li class="nav-item" >
        <a class="nav-link font-weight-bold" href="{% url 'contact' %}"><i class="fas fa-envelope" style="font-size:20px; padding-right: 4px; color:#2196F3"></i>Contact Us</a>
    </li>
{% endblock greeting %}

{% block section %} 


    <section class="mt-2 bg-white mx-2">
        
        <div class="container-fluid border-0 text-justify">
            <div class="row">
                <span class="font-weight-bold px-2 py-1 mx-auto text-danger">...Created with<span class="h3"> &hearts;</span>... Because we understand that behind every review, there is a hearty experience...</span>
            </div>
            <div class="row mx-2">
                <div class="col-md-5 mb-2">
                    <div class="card" style="width: 23rem;">
                        <img src="{{request.user.userprofilecompany.profile_photo.url}}" class="card-img-top" alt="profile picture">
                        <div class="card-body">
                            <h5 class="card-title">Company Name: &nbsp; {{request.user.userprofilecompany.company_name}}</h5>
                            <p class="card-text">Username: {{request.user.username}} </br><span class="font-weight-sm">this is publicly visible</span></p>
                            <p class="card-text">Fullname: &nbsp;{{request.user.last_name}},&nbsp;{{request.user.first_name}}</p>
                            <p class="card-text">Designation: &nbsp; {{request.user.userprofilecompany.designation}}</p>
                            <p class="card-text">Email: &nbsp;{{request.user.email}}</p>
                            <p class="card-text">Phone:&nbsp;{{request.user.userprofilecompany.phone}}</p>
                            <p class="card-text">Location: &nbsp;{{request.user.userprofilecompany.location}}</p>
                            <p class="card-text">Package: &nbsp;{{request.user.userprofilecompany.package}}&nbsp;&nbsp;&nbsp;<a href="#" class="btn btn-primary btn-sm">Upgrade</a></p>

                            
                            <p class="card-text"></p>
                            <a href="{% url 'settings_company' %}" class="btn btn-outline-info">Go to Settings</a></br>
                            <p class="card-text"></p>
                            <a href="{% url 'logoutpage_company' %}" class="btn btn-outline-info">Logout</a></br>
                        </div>
                     </div>

                </div>
                
                {% for company in companies %}
                    {% if company.user == request.user %}
                
                <div class="col-md mb-2">
                    
                    <div class="row">
                        <div class="col-md mb-2">
                            
                            <div class="card text-center  mb-3"> 
                                <div class="card-header text-white bg-info">
                                    <h5 class="card-title">Total Reviews</h5>
                                </div>
                                <div class="card-body">
                                    <h3 class="card-title"></h3>
                                </div>
                                <div class="card-body">
                                    <h3 class="card-title"></h3>
                                </div>
                                <div class="card-body">
                                    <h3 class="card-title">{{ company.review_set.all.count }}</h3>
                                </div>
                                
                                <div class="card-body">
                                    <h3 class="card-title"></h3>
                                </div>
                                
                                <button class="btn btn-info font-weight-bold btn-sm" id="tm-reviews">View Reviews and Responses</button>
                            </div>

                            
                        </div>
                        
                        <div class="col-md mb-2">
                            
                                <div class="card  mb-3" > 
                                    <div class="card-header text-center text-white bg-info">
                                        <h5 class="card-title ">Statistics</h5>
                                    </div>
                                    
                                    <div class="py-2 font-weight-bold px-2">
                                        <p class="card-text">Average Rating:&nbsp; | &nbsp; <i id="tm-average_rating">{{company.average_rating}}</i><i>/5</i> </p>
                                        <p class="card-text">Remarks: &nbsp; | &nbsp;<i id="tm-remarks" class=""></i></p>
                                        <p class="card-text">Total Likes: &nbsp; | &nbsp; like count number</p>
                                        <p class="card-text">Total Dislikes: &nbsp; | &nbsp; dislike count number</p>
                                        <p class="card-text">Average Rating:&nbsp; | &nbsp; 4/5 </p>
                                        <p class="card-text">Remarks: &nbsp; | &nbsp;Satisfactory</p>
                                        <p class="card-text">Total Views: &nbsp; | &nbsp; 10</p>
                                        
                                        <p class="card-text"><h6 class=" font-weight-bold">Claimed Company:&nbsp; <span class= "text-primary"><a class="text-decoration-none" href="{% url 'detail' company.id %}" target="_blank"> {{company.company_name}} </a> </span> </h5></p>
                                        
                                    </div>
                                    
                                    <button class="btn btn-info font-weight-bold btn-sm" id="tm-reviews">Click to Get Noticed</button>
                                    
                                </div>                      

                        </div>
                        
                    </div>
                    
                    <div class="row" id="tm-display-reviews">
                            <div class="col-md mb-2">
                            
                                <div style="font-size: small;" class="card text-center  mb-3"> 
                                    <div class="card-header text-white bg-info">
                                        <h5 class="card-title">Details</h5>
                                    </div>
                                    
                                    <div class="card-body">
                                        {% for review in company.review_set.all %}
                                        <div  class=" py-2">
                                            <p class="card-text ">Name: &nbsp; {{review.user | capfirst }} Rating: {{review.rating}}/5 &nbsp; | &nbsp; Date added: <span class="text-danger"> {{ review.date_added }}</span></p>
                                            <p class="card-text">  Review: &nbsp; {{review.review_text}} </p>
                                        
                                        
                                        <!-- check to see if there is a reponse under this review to know whether
                                         to show the button -->
                                        {% for response in review.response_set.all %} 
                                            {% empty %}                                            
                                        <p class="card-text"><a href="{% url 'response' review.id %}"><button id="tm-respond" class="btn btn-outline-primary font-weight-bold btn-sm">respond to this review</button></a></p>
                                            
                                        {% endfor %}
                                       
                                        {% for response in responses%}
                                        {% if response.review == review %}
                                        <p class="card-text bg-light font-italic">{{response.review.company | capfirst }} responded: {{response}} on: {{response.date_added}}</p>
                                        <hr>
                                        {% endif %}
                                        {% endfor %}
                                        
                                        {% endfor %}
                                        
                                        </div>
                                                                                                                   
                                    
                                    
                                    
                                    </div>
                                </div>
                                
                            </div>
                            
                    
                    </div>
                    
                </div>
                    
                    {% endif %}
                    
                {% endfor %}
               
                
                <div class="col-md mb-2">
                    <!-- The problem is here. It seems to rund the code over and over again-->
                      {% for company in companies %}
                      {% if company.user != request.user%}
                    
                    <div class="row">
                        <div class="col-md mb-2">
                            
                            <div class="card text-center  mb-3"> 
                                <div class="card-header text-white bg-info">
                                    <h5 class="card-title">Total Reviews</h5>
                                </div>
                                <div class="card-body">
                                    <p class="card-text"> You have not claimed a company yet.</p>
                                    <p class="card-text"> You need to claim a company to view its statistis here.</p>
                                    <p class="card-text"> You need to have your company listed to claim it.</p>
                                    <p class="card-text"> If your company is already listed on our site, kindly email us on:</p>
                                    <p class="card-text"> <a href="mailto:info@crediblereviews.ng">info@crediblereviews.ng</a></p>
                                </div>
                                
                                
                                
                                
                               
                            </div>

                            
                        </div>
                        
                        <div class="col-md mb-2">
                            
                                <div class="card  mb-3" > 
                                    <div class="card-header text-center text-white bg-info">
                                        <h5 class="card-title ">Statistics</h5>
                                    </div>
                                    
                                    <div class="py-2 font-weight-bold px-2">
                                        <p class="card-text">Average Rating:&nbsp; | &nbsp; <i id="tm-average_rating">{{infor}}</i> </p>
                                        <p class="card-text">Remarks: &nbsp; | &nbsp;<i id="tm-remarks" class="">{{infor}}</i></p>
                                        <p class="card-text">Total Likes: &nbsp; | &nbsp; {{infor}}</p>
                                        <p class="card-text">Total Dislikes: &nbsp; | &nbsp; {{infor}}</p>
                                        <p class="card-text">Average Rating:&nbsp; | &nbsp; {{infor}} </p>
                                        <p class="card-text">Remarks: &nbsp; | &nbsp;{{infor}}</p>
                                        <p class="card-text">Total Views: &nbsp; | &nbsp; {{infor}}</p>
                                        
                                        <p class="card-text"><h6 class=" text-warning font-weight-bold">{{info}}:&nbsp; <span style="font-size: small;" class= "text-info"> Email us to claim a company </span> </h5></p>
                                        
                                    </div>
                                    
                                    <button class="btn btn-info font-weight-bold btn-sm" id="tm-reviews">Click to Get Noticed</button>
                                    
                                </div>                      

                        </div>
                        
                    </div>
                    {% endif %}
                    {% endfor %}
                    <!---->
                    
                </div>
                
               
               
                
            </div>
        </div>
        
    </section>
    {% endblock section %}
    {% block article %}
    
    {% endblock article %}

问题是最后一个循环,它似乎打印代码的次数与模型实例不匹配条件的次数一样多。这不是我想要的。我希望能够检查 request.user 是否不等于 company.user 并打印最后一个部门。非常感谢您的帮助...

【问题讨论】:

  • 请修正你的缩进

标签: python django django-models django-views django-templates


【解决方案1】:

在模板中进行数据过滤是对 Django 框架的误用。由于它是一个简单的过滤(或数据路由),您可以在创建上下文时使用 campaigns.filter(user=request.user) 而不是 campaigns 简单地过滤掉不需要的活动。

【讨论】:

  • 感谢阿里的建议。但是 request.user.id 永远不会等于 company.id。这样部分代码将在模板中的两个实例中运行。是否无法从视图中的上下文字典中查询模板中的公司以仅返回 company.user = 特定用户的公司,即。请求用户
【解决方案2】:

感谢阿里的帮助。但是选择 where user=request.user 会引发异常说:在分配之前参考。我尝试了 try 和 except 阻止这个没办法。

我终于用javascript解决了这个问题。在我的用户模型中,我插入了一个布尔字段。 Javascript 现在将检查此字段以了解是隐藏还是显示分区。它可以按照我想要的方式正常工作。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2018-09-02
    • 2021-04-21
    • 2019-07-29
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2014-06-12
    • 2020-09-10
    相关资源
    最近更新 更多