postgresql 构建django detailview和listview而不使用< int:pk>

zz2j4svz  于 5个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(61)

我正在构建一个django应用程序,它可以显示员工及其工资的数据库。它使用postgres数据库。我正在努力弄清楚如何在不使用URL主键的情况下构建DetailView。我认为使用slug可能是解决方案,但我不确定如何实现,并且在网上搜索时没有太多运气。
所有公司列表的“我的列表”视图:

class AllCompanies(FormMixin, generic.ListView):
template_name = 'AllCompanies.html'
form_class = SearchForm
model = bigdatabase
queryset = bigdatabase.objects.order_by().values('company').distinct()
context_object_name = 'companies'

字符串
示例数据库片段,bigdatabase:

Company EmployeeName Salary
Alpha   Jim          100000
Alpha   Tim          125000
Beta    Bim          90000


我的列表视图按预期显示所有唯一的公司名称。但是,我不确定如何继续并构建详细视图以显示每个唯一公司的更多信息。我想显示员工人数,工资中位数等内容。
我也做过类似的事情,为员工构建一个detailview,但是这依赖于在url中使用他们的主键,因为每个员工都是唯一的。由于我的数据库中有许多公司的条目,我如何构建一个detailview和相应的url结构来支持它?
任何建议或指针,以推动这一沿着将不胜感激。

jm2pwxwz

jm2pwxwz1#

你可以在你的bigdatabase模型中添加一个slugfield。尝试使用autoslugfield并将其设置为公司名称,如下所示:

from django_extensions.db.fields import AutoSlugField

class bigdatabase(models.Model): 
company = Models.Charfield()
slug = models.AutoSlugField(populate_from=['company']
......

字符串
这可以确保您的公司名称将自动被翻译为在URL中使用。例如,当您的公司名称中有空格时,使用str:company将翻译为空格的奇怪字符。在您的URL中使用将其翻译为-。
修改你的模型字段slug确保你的detailview默认获得slug字段。参见文档。
然后,您的视图将类似于:

class CompanyDetailView(DetailView):
model = bigdatabase 
template_name = '#path_to_template'
slug_url_kwarg = 'slug' # I believe this is done correctly by default but in case you change the field name.


在你的URL中,你可以做上面提到的事情:

path('company/<slug>', views.CompanyDetailView.as_view())


编码快乐!

soat7uwm

soat7uwm2#

我不确定我是否理解正确,但我认为你可以使用这样的东西:

path('company/<str:name>', views.company_detail_view)

字符串

xeufq47z

xeufq47z3#

我有一个类似的情况,我想显示用户配置文件,而不使用他们的user_id在URL。所以URL将是http://localhost:8000/accounts/profile/
我能够通过覆盖ProfileDetailView中的get_querysetget_object方法来解决这个问题。

class ProfileDetailView(DetailView, LoginRequiredMixin):
model = Profile
template_name = "account/profile.html"

def get_queryset(self):
    qs = super(ProfileDetailView, self).get_queryset()
    return qs.filter(user=self.request.user)

def get_object(self, queryset=None):
    if queryset is None:
        queryset = self.get_queryset()
    
    try:
        # Get the single item from the filtered queryset
        obj = queryset.get()
    except queryset.model.DoesNotExist:
        raise Http404(
            ("No %(verbose_name)s found matching the query")
            % {"verbose_name": queryset.model._meta.verbose_name}
        )
    return obj

字符串

相关问题