【问题标题】:How to use 2 models in class base View that is Home view and Detailview如何在主视图和详细视图的类基础视图中使用 2 个模型
【发布时间】:2020-12-18 10:02:15
【问题描述】:

我有两个模型 ItemWomen 这是我的 2 个模型的代码

class Item(models.Model):
    title = models.CharField(max_length=100)
    price = models.FloatField()
    discount_price = models.FloatField(blank=True, null=True)
    category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
    label = models.CharField(choices=LABEL_CHOICES, max_length=1)
    slug = models.SlugField()
    description = models.TextField()
    image = models.ImageField()
    
    def __str__(self):
        return self.title

    class Women(models.Model):
        title = models.CharField(max_length=100)
        price = models.FloatField()
        discount_price = models.FloatField(blank=True, null=True)
        category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
        label = models.CharField(choices=LABEL_CHOICES, max_length=1)
        slug = models.SlugField()
        description = models.TextField()
        image = models.ImageField()
    
        def __str__(self):
            return self.title

在我的view.py 我创建了Homeview(View) 来渲染homepage.html,我使用get_context_data 来渲染ItemWomen 这两个模型。

这是我的views.py的代码

class HomeView(ListView):
       
     template_name='Ecommerce/home-page.html'
    
     def get_queryset(self):
         return Item.objects.all()
    
     def get_context_data(self, **kwargs):    
         et =super(HomeView, self).get_context_data(**kwargs)
         et['Item_qs']= Item.objects.all()
         et['women_qs']= Women.objects.all()
         return et
  

class ProductDetailView(DetailView):
      model= Women,Item
      template_name='Ecommerce/product-page.html' 

我不知道我是否为 2 个模型正确编写了 ProductDetailView

现在在主页中我的第一个 div 我使用 Item 模型循环遍历 而我的第二个 div 我使用 Women 模型循环遍历

这就是我在我的 html 模板中呈现两个视图的方式 第一个用于项目模型

     {% for item in Item_qs %}
              <div class="col-lg-3 col-md-6 mb-4">
              
                  <!--Card image-->
                  <div class="view overlay">
                    <img src="{{ item.image.url }}" class="card-img-top"
                      alt="">
                    <a href="{{item.get_absolute_url}}">
                      <div class="mask rgba-white-slight"></div>
                    </a>
                  </div>
                  <!--Card image-->
    
                </div>
                <!--Card-->
    {% end%}

这是给女性模特的

    {% for items in women_qs %}
              <!--Grid column-->
              <div class="col-lg-3 col-md-6 mb-4">
    
                <!--Card-->
                <div class="card zoom">
    
                  <!--Card image-->
                  <div class="view overlay">
                    <img src="{{ items.image.url }}" class="card-img-top"
                      alt="">
                    <a href="{{items.get_absolute_url}}">
                      <div class="mask rgba-white-slight"></div>
                    </a>
                  </div>
                
                </div>
                <!--Card-->
    
              </div>
               {% endfor %}

我使用 get_absoulte_url 作为获取 Productpage.html 的 href 链接 下面是代码

def get_absolute_url(self):
        return reverse("Ecommerce:product", kwargs={
             'slug': self.slug    })

我的问题是如何创建 ProductDetailpage(Detailview) 来获取 Item 模型和 Women 模型中各个项目的详细信息? 以及如何在模板中呈现两者 请我相信我的问题很清楚,如果有人需要澄清,我可以进一步解释。 期待你的援助之家????

【问题讨论】:

  • 发布一些代码来尝试解释/说明你在做什么。

标签: django-models django-views django-class-based-views


【解决方案1】:

好的,您不能将DetailView 用于多个模型。你最好写一个普通的View 并允许它的 URL 为每个模型使用 2 个参数。

然后你可以在你的视图中获取每个实例。

它会像这样工作;

urlpatterns = [
    path('<int:item_id>/<int:women_id>', MultiModelView.as_view()),
]
class MultiModelView(View):


    def __init__(self, **kwargs):
        """ Constructor """
        super().__init__(**kwargs)
        self.item_id = None
        self.women_id = None

    def dispatch(self, request, *args, **kwargs):
        self.item_id = self.kwargs.get('item_id')
        self.women_id = self.kwargs.get('women_id')
        return super().dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'item': Item.objects.get(id=self.item_id),
            'woman': Women.objects.get(id=self.women_id),
        })
        return context

【讨论】:

  • 这里我创建了一个函数 get_absolute_url 来获取 Productpage.html 我还能用它作为 href 链接吗?对于这两种情况?
  • @proflord 你没有展示你的get_absolute_url 做了什么,所以我只能假设你可以使用它,因为你有2个对象实例
  • def get_absolute_url(self): return reverse("Ecommerce:product", kwargs={ 'slug': self.slug }) 这是用来获取productpage模板的东西,因为你正在使用获取两个 id 的 int 我正在使用关键字参数 '{'slug': 'women'}' 为 'product' 获取 Reverse。尝试了 1 种模式:['product(?P[-a-zA-Z0-9_]+)/(?P[-a-zA-Z0-9_]+)$']
  • 如果您想要一个链接来访问 2 个对象的页面,您必须在您有两个可用 ID 的模板中创建它。 get_absolute_url 旨在为您提供指向该对象的链接,除非您自定义内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2011-09-28
  • 2015-01-29
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多