Skip to main content
 首页 » 编程设计

python之用于过滤和检查该模型中是否存在相关数据的 Django 模板语法/标记

2025年01月19日27birdshome

我正在使用 python-3.6.4 和 django-2.0.2 开发一个项目。为简单起见,我将简要说明情况。假设,有三个应用程序:-“问题”、“解决事件”和“配置文件”,其中包含三个模型(如下所述)。每个问题都有一个“DetailView”页面。我想显示登录用户是否解决了问题。

我想使用的 django 模板标签是这样的:

{% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %} 

这里是上面提到的文件:

“问题/模型.py”:

class Problem(models.Model): 
  name = models.CharField(max_length=20) 
  slug = models.SlugField(allow_unicode=True, max_length=100, unique=True) 
 
  def __str__(self): 
    return self.name 
 
  def get_absoulte_url(self): 
    return reverse('problems') 
    return reverse('problems:problem_detail', kwargs={'slug':self.slug}) 

我在“problems/urls.py”中使用了 urlpatterns 作为“path('/', views.ProblemDetail.as_view(), name='problem_detail')”。

“profiles/models.py”(继承自 auth.models.User):

class User(auth.models.User, auth.models.PermissionsMixin): 
def __str__(self): 
    return self.username 

“solve_activities/models.py”:

class Solve(models.Model): 
  problem = models.ForeignKey(Problem, on_delete=models.CASCADE, related_name="solved") 
  solver = models.ForeignKey(User, on_delete=models.CASCADE, related_name="solved") 

我只会在用户解决问题时创建此对象。

现在,我在 problems/views.py 上的 ProblemDetail View :

class ProblemDetail(generic.DetailView): 
  model = Problem 
  template_name = 'problems/problem_detail.html' 

还有“problems/problem_detail.html”文件,我基本上面临着复杂性:

<h1>{{problem}}</h1> 
<h4>Solve Status: {% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %}Solved{% else %}Unsolved{% endif %}</h4> 

再次,

{% if user.is_authenticated and problem.solved.all.filter(solver={{user.username}}) %} 

是我想做的,但我找不到任何关于如何正确完成它的有用资源。

它引发的错误是:

TemplateSyntaxError at /problems/timus-1000/ 
Could not parse the remainder: '(solver={{user}})' from 'problem.solved.all.filter(solver={{user}})' 

请您参考如下方法:

不要在模板中做逻辑,那是 View 的作用。将其添加到上下文中并在模板中使用它。

class ProblemDetail(generic.DetailView): 
    ... 
    def get_context_data(self, *args, **kwargs): 
        context = super(ProblemDetail, self).get_context_data() 
        context["solve_status"] = self.request.user.is_authenticated and context["object"].solved.filter(solver=self.request.user).exists() 
        return context 

然后在模板中使用

{% if solve_status %} ..