【问题标题】:django table 2: hard code template url into table rowdjango 表 2:将模板 url 硬编码到表行中
【发布时间】:2020-08-13 16:42:24
【问题描述】:

我正在尝试超链接 的类列的行以用作到其他页面的链接。我阅读了有关超链接的文档以及此处的一些帖子,例如The linkcolumn about django-tables2。但它们并没有解决我的问题,因为据我了解,该链接是通过在每一行中引用 UNIQUE TABLE 的 Pks 来建立的。

在我的情况下,每行的链接使用不同的模型,所以我不知道如何引用 pk。

到目前为止,我可以做到以下几点: 主页表:

class ClassificationTable(tables.Table):
    
    Class = tables.TemplateColumn('<a href="{{record.extra_details_view}}">{{record.Class}}</a>')
    revenue_proportion = tables.Column(gettext_lazy("revenue proportion"),localize= True)
    Quantity_of_items = tables.Column(gettext_lazy("quantity of items"),localize= True)

    class Meta:
        model = Classification
        fields = ('Class',
                  'revenue_proportion',
                  'Quantity_of_items',
                  
                 )
        template_name = "django_tables2/bootstrap4.html"
 

这是主页的html代码:

{%  load static %}
{% load i18n %}
{% load django_tables2 %}
class="no-padding-bottom">
          <div class="container-fluid">
            <div class="row">
              <div class="col-lg-8">

                {% render_table table %}
              </div>

这是分类的模型:

class Classification(models.Model):
    Class = models.CharField(max_length=10, primary_key=True)
    revenue_proportion = models.FloatField(default=0)
    Quantity_of_items = models.IntegerField(default=0)
    
    def __str__(self):
       return self.Class

以下是其他页面中使用的模型:

class class_aa1(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
    revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
    margin = models.FloatField(default=0, verbose_name= 'value')
    number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
    number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
    
    def __str(self):
        return self.Id

    def extra_details_view(self):
        return reverse("exostocksaas.dashboard.classAA1page")
    

class class_a1(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
    revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
    margin = models.FloatField(default=0, verbose_name= 'value')
    number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
    number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
    
    def __str(self):
        return self.Référence

    def extra_details_view(self):
        return reverse("exostocksaas.dashboard.classA1page")
    
    
class class_b1(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
    revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
    margin = models.FloatField(default=0, verbose_name= 'value')
    number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
    number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
    
    def __str(self):
        return self.Référence

    def extra_details_view(self):
        return reverse("exostocksaas.dashboard.classB1page")
    
    
class class_c1(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
    revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
    margin = models.FloatField(default=0, verbose_name= 'value')
    number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
    number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
    
    def __str(self):
        return self.Référence

    def extra_details_view(self):
        return reverse("exostocksaas.dashboard.classC1page")
    
    
class class_d1(models.Model):
    Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
    revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
    margin = models.FloatField(default=0, verbose_name= 'value')
    number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
    number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
    
    def __str(self):
        return self.Référence

    def extra_details_view(self):
        return reverse("exostocksaas.dashboard.classD1page")
    

我希望有人可以帮助我解决这个问题,我在这个问题上纠结太久了。如有必要,我很乐意提供更多信息。干杯

更新:我按照答案中的建议进行了尝试(更新了我的代码),现在类列中的行可以作为链接单击,但它们似乎在调用同一页面,因为没有任何变化。

这是我在日志中得到的:

Traceback (most recent call last):
  File "/home/ubuntu/exo/lib/python3.6/site-packages/django/template/base.py", line 849, in _resolve_lookup
    (bit, current))  # missing attribute
django.template.base.VariableDoesNotExist: Failed lookup for key [extra_details_view] in <Classification: ClassAA>
DEBUG Exception while resolving variable 'extra_details_view' in template 'dashboard/analytics.html'.
Traceback (most recent call last):
  File "/home/ubuntu/exo/lib/python3.6/site-packages/django/template/base.py", line 828, in _resolve_lookup
    current = current[bit]
TypeError: 'Classification' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ubuntu/exo/lib/python3.6/site-packages/django/template/base.py", line 836, in _resolve_lookup
    current = getattr(current, bit)
AttributeError: 'Classification' object has no attribute 'extra_details_view'

我不熟悉引用链接的建议技术,所以我不确定发生了什么,有人有线索吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我发现这个问题告诉您如何为列创建任意链接:django-tables2 linkColumn external url

    而不是这个:

    Class = tables.Column(gettext_lazy("class"),localize= True)
    

    试试这个:

    Class = tables.TemplateColumn('<a href="{{record.extra_details_view}}">{{record.class}}</a>')
    

    然后,您需要在每个模型类上为方法 extra_details_view 定义一个可调用对象,以返回该视图的 URL:

    class class_aa1(models.Model):
        Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
        revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
        margin = models.FloatField(default=0, verbose_name= 'value')
        number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
        number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
        
        def __str(self):
            return self.Id
    
        def extra_details_view(self):
            return reverse("myproj.myapp.myview")
            // or hardcode it
            return "/this/class/extra/details/view/url"
    

    编辑

    也许试试这个,看看你是否能让链接显示出来?

    Class = tables.TemplateColumn('<a href="{{record.extra_details_view}}">Class Name Goes Here</a>')
    

    编辑 2

    也许回到这里看看是否可以获取属性而不是方法:

    Class = tables.TemplateColumn('<a href="{{record.extra_details_url}}">{{ record.Class }}</a>')
    

    class class_aa1(models.Model):
        Id = models.CharField(max_length=100, primary_key=True, verbose_name= 'items')
        revenue_contribution_in_percentage = models.FloatField(default=0, verbose_name= 'value contribution')
        margin = models.FloatField(default=0, verbose_name= 'value')
        number_of_orders_placed = models.FloatField(default=0, verbose_name= 'number of orders placed')
        number_of_sales = models.FloatField(default=0, verbose_name= 'number of sales')
        
        def __str(self):
            return self.Id
    
        extra_details_url = reverse("myproj.myapp.myview")
        # or hardcode it
        extra_details_url = "/this/class/extra/details/view/url"
    

    如果 django tables2 项目无法识别类的方法,它可能只会读取一个普通变量。

    编辑 3

    我想我们已经想通了!您设置数据库模型的方式我不认为有一种很好的方法可以在单个分类和单个模型的类之间实现直接链接。您已经手动映射,所以我认为您也可以手动映射 URL。

    class Classification(models.Model):
        Class = models.CharField(max_length=10, primary_key=True)
        revenue_proportion = models.FloatField(default=0)
        Quantity_of_items = models.IntegerField(default=0)
        extra_details_url = models.URLField()
        
        def __str__(self):
           return self.Class
    

    您必须将整个 URL 放在那里,包括 http://....,这并不理想,但它会起作用。

    我认为更好的选择是这样的:

    class Classification(models.Model):
        Class = models.CharField(max_length=10, primary_key=True)
        revenue_proportion = models.FloatField(default=0)
        Quantity_of_items = models.IntegerField(default=0)
        extra_details_view = models.CharField()
        
        def __str__(self):
           return self.Class
    
        def extra_details_url(self):
            return reverse(self.extra_details_view)
    

    无论哪种情况,您都需要将模板更改为:

    Class = tables.TemplateColumn('<a href="{{record.extra_details_url}}">{{record.class}}</a>')
    

    像这样进行另一个名称更改有点愚蠢,但我建议这样做,因为将其命名为 URL 是有意义的。它还允许您释放 extra_details_view 名称以保存视图本身的值,例如 "exostocksaas.dashboard.classAA1page"

    我认为这一切最终都会奏效。祝你好运!

    【讨论】:

    • 我遵循了您的更改,虽然我没有收到任何错误,但类列中的值未显示,此列中的每一行都是空的
    • 查看源代码时会发生什么?有链接但缺少文字吗?也许尝试用{{ record.class }} 代替{{ record.class }} 作为链接名称硬编码字符串“类名”,然后看看你是否能看到一些东西。如果这使链接成为可点击的链接,那么问题就出在类名/链接文本上。如果这不起作用,那么似乎存在更大的问题。
    • 我更新了我的帖子,看看,链接在那里,但似乎指向原始页面
    • 感谢您的更新,不幸的是,我坚持使用相同的输出和结果,甚至尝试将 url 作为变量而不是函数传递
    • 这行得通,谢谢你,迈克!如果有人在这里绊倒,则需要将链接放在 db 行“extra_details_view”中的页面
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 2013-01-10
    • 2018-07-28
    • 2010-10-22
    • 2013-05-26
    • 2020-11-19
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多