Django 在基于类的视图中使用多个URL参数获取_对象

Django 在基于类的视图中使用多个URL参数获取_对象,django,django-views,django-urls,django-class-based-views,Django,Django Views,Django Urls,Django Class Based Views,好的,我对这方面还比较陌生,我已经在我的项目上工作了几个月了,我想创建一个URL,它接受多个参数来调用一个视图。示例URL如下所示: /m// 通过在我的DetailView中重写get_对象,我已经成功地实现了这一点,但我想知道是否有更好/更简单的方法来实现这一点,或者这被认为是一种不好的做法。任何指导都将不胜感激 url.py urlpatterns = [ # url(r'^$', builder_list, name='list'), # url(r'^create/$'

好的,我对这方面还比较陌生,我已经在我的项目上工作了几个月了,我想创建一个URL,它接受多个参数来调用一个视图。示例URL如下所示: /m//

通过在我的DetailView中重写get_对象,我已经成功地实现了这一点,但我想知道是否有更好/更简单的方法来实现这一点,或者这被认为是一种不好的做法。任何指导都将不胜感激

url.py

urlpatterns = [
    # url(r'^$', builder_list, name='list'),
    # url(r'^create/$', builder_create, name='create'),
    # url(r'^(?P<slug>[\w-]+)/$', builder_detail, name='detail'),
    # url(r'^(?P<slug>[\w-]+)/edit/$', builder_update, name='update'),
    # url(r'^(?P<slug>[\w-]+)/delete/$', builder_delete, name='delete'),

    # url(r'^$', builder_list, name='sub_list'),
    # url(r'^m/create/$', sub_create, name='sub_create'),
    url(r'^(?P<builder>[\w-]+)/m/(?P<market>[\w-]+)/$', sub_detail, name='sub_detail'),
    # url(r'^m/(?P<slug>[\w-]+)/edit/$', sub_update, name='sub_update'),
    # url(r'^m/(?P<slug>[\w-]+)/delete/$', sub_delete, name='sub_delete'),
]
    url(r'^(?P<city>[0-9]+)/(?P<category>[0-9]+)/$', views.EntryListView.as_view(), name='entry'),
和models.py作为参考--我的get\u absolute\u url函数也有问题吗

class Builder(models.Model):
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    company_name = models.CharField(max_length=80, help_text="Full Company Name", unique=True)
    short_name = models.CharField(help_text="Short Company Name", max_length=30)
    slug = models.SlugField(unique=True)
    website = models.CharField(max_length=80, help_text="Format: www.[website].com")
    logo = models.ImageField(blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    info = RedactorField(verbose_name=u'Company Info')

    def show_website_url(self):
        return format_html("<a href='{url}'>{url}</a>", url=self.website)

    def __str__(self):
        return self.short_name


class BuilderSub(models.Model):
    parent = models.ForeignKey(Builder)
    market = models.ForeignKey(Market, null=True, blank=True)
    details = RedactorField(verbose_name=u'Details', blank=True, null=True)
    main_contact = models.ForeignKey(Person, blank=True, null=True)

    def __str__(self):
        return "{}: {} - {}".format(self.pk, self.market.name, self.parent.short_name)

    def get_absolute_url(self):
        return reverse('builders:sub_detail', kwargs={'market': self.market.slug, 'builder': self.parent.slug})


def pre_save_builder_reciever(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.short_name)

pre_save.connect(pre_save_builder_reciever, sender=Builder)
类生成器(models.Model):
添加了\u by=models.ForeignKey(settings.AUTH\u USER\u MODEL,默认值=1)
公司名称=models.CharField(最大长度=80,帮助文本=“完整公司名称”,unique=True)
short\u name=models.CharField(help\u text=“short Company name”,最大长度=30)
slug=models.SlugField(unique=True)
网站=models.CharField(最大长度=80,帮助文本=“格式:www.[website].com”)
logo=models.ImageField(空白=True,空=True)
timestamp=models.DateTimeField(auto\u now\u add=True)
信息=编辑字段(详细名称=公司信息)
def show_website_url(self):
返回格式(html(“,url=self.website)
定义(自我):
返回self.short\u名称
类BuilderSub(models.Model):
父项=模型。外键(生成器)
market=models.ForeignKey(market,null=True,blank=True)
details=RedactorField(verbose\u name=u'details',blank=True,null=True)
main_contact=models.ForeignKey(Person,blank=True,null=True)
定义(自我):
返回“{}:{}-{}”。格式(self.pk、self.market.name、self.parent.short_name)
def get_绝对_url(自身):
返回反向('builders:sub_detail',kwargs={'market':self.market.slug,'builder':self.parent.slug})
def pre_save_builder_receiver(发送方、实例、*args、**kwargs):
instance.slug=slugify(instance.short_name)
pre_save.connect(pre_save_builder_receiver,sender=builder)

我不能100%确定我的建筑商Sub模式是否是处理整体建筑商(公司)和他们服务的市场之间关系的适当方式,因此任何指导都将受到赞赏。

是的,确实有一种更合乎道德的方式来做到这一点。DetailView只处理一个对象。然而,ListView完成了任务

我用城市和类别取代了建筑商和市场

我也是初学者。希望我已经回答了你的问题:)

views.py

class BuilderSubDetailView(DetailView):
    model = BuilderSub
    template_name = "builders/sub_detail.html"

    def get_context_data(self, **kwargs):
        context = super(BuilderSubDetailView, self).get_context_data(**kwargs)
        context['now'] = timezone.now()
        print(context)

        return context

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()

        # Next, try looking up by primary key.
        builder = self.kwargs['builder']
        builder_id = Builder.objects.filter(slug=builder).first().pk
        market = self.kwargs['market']
        market_id = Market.objects.filter(slug=market).first().pk
        if builder is not None and market is not None:
            queryset = BuilderSub.objects.filter(parent=builder_id).filter(market=market_id)

        # If none of those are defined, it's an error.
        if builder is None or market is None:
            raise AttributeError("Generic detail view %s must be called with "
                                 "Builder and Market"
                                 % self.__class__.__name__)
        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
class EntryListView(generic.ListView):

template_name = 'myapp/category.html'
context_object_name = 'entry'
def get_queryset(self):
    city_id = self.kwargs['city']
    category_id = self.kwargs['category']
    entry = Entry.objects.all().filter(city=city_id).filter(category=category_id)
    return entry
url.py

urlpatterns = [
    # url(r'^$', builder_list, name='list'),
    # url(r'^create/$', builder_create, name='create'),
    # url(r'^(?P<slug>[\w-]+)/$', builder_detail, name='detail'),
    # url(r'^(?P<slug>[\w-]+)/edit/$', builder_update, name='update'),
    # url(r'^(?P<slug>[\w-]+)/delete/$', builder_delete, name='delete'),

    # url(r'^$', builder_list, name='sub_list'),
    # url(r'^m/create/$', sub_create, name='sub_create'),
    url(r'^(?P<builder>[\w-]+)/m/(?P<market>[\w-]+)/$', sub_detail, name='sub_detail'),
    # url(r'^m/(?P<slug>[\w-]+)/edit/$', sub_update, name='sub_update'),
    # url(r'^m/(?P<slug>[\w-]+)/delete/$', sub_delete, name='sub_delete'),
]
    url(r'^(?P<city>[0-9]+)/(?P<category>[0-9]+)/$', views.EntryListView.as_view(), name='entry'),

我相信您可以使用不同的参数创建多个URL,然后将它们全部指向同一个视图。