簡體   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