繁体   English   中英

Django 模板查询集和过滤器

[英]Django Template Query Set and filters

在我看来,我有一个模型,它返回具有外键的模型的所有实例给用户。 此视图呈现一个配置文件页面,其中针对 request.user 检查 model.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 并打印最后一个部门。 非常感谢你的帮忙...

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

谢谢阿里的帮助。 但是选择 where user=request.user 会引发异常说:分配前引用。 我为此尝试了 try 和 except 块。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM