Django-将两个模型传递到一个视图中,并显示两个模型

问题描述 投票:0回答:1

我正在尝试将两个模型传递到创建视图中,在该视图中,我试图从URL中获取主键,以从食品卡车模型中检索详细信息,以便可以在页面中显示该模型,并在其中显示用户可以写有关美食车的评论。另外,我希望页面上显示评论列表。

views.py

class TruckReviewView(CreateView):
    model = Review
    template_name = 'truckReviews/detail.html'
    fields = ['speedOfService', 'qualityAndTaste', 'valueForMoney', 'comment']

    def get_queryset(self):
        self.pk = self.kwargs['pk']
        queryset = super(TruckReviewView, self).get_queryset()
        return queryset

    def get_context_data(self, **kwargs):
        context = super(TruckReviewView, self).get_context_data(**kwargs)
        context['truck'] = FoodTrucks.objects.get(truckID=get_queryset())
        context['reviews'] = Review.objects.get(truckID=get_queryset())
        return context

urls.py

urlpatterns = [
    path('', TruckListView.as_view(), name='reviews-home'),
    path('truck/<int:pk>/', TruckReviewView.as_view(), name='truck-detail'),
    path('about/', About.as_view(), name='reviews-about'),
]

models.py

class FoodTrucks(models.Model):
    truckID = models.IntegerField(primary_key=True, unique=True, null=False)
    name = models.CharField(max_length=25)
    category = models.CharField(max_length=20)
    bio = models.TextField()
    avatarSRC = models.TextField(default=None)
    avatarALT = models.CharField(max_length=20, default=None)
    avatarTitle = models.CharField(max_length=20, default=None)
    coverPhotoSRC = models.TextField(default=None)
    coverPhotoALT = models.CharField(max_length=20, default=None)
    coverPhotoTitle = models.CharField(max_length=20, default=None)
    website = models.TextField(default=None)
    facebook = models.CharField(max_length=100, default=None)
    instagram = models.CharField(max_length=30, default=None)
    twitter = models.CharField(max_length=15, default=None)


class Review(models.Model):
    reviewID = models.AutoField(primary_key=True, unique=True, serialize=False, null=False)
    truckID = models.ForeignKey(FoodTrucks, on_delete=models.CASCADE)
    userID = models.ForeignKey(User, on_delete=models.CASCADE)
    datePosted = models.DateTimeField(default=timezone.now)
    speedOfService = models.IntegerField()
    qualityAndTaste = models.IntegerField()
    valueForMoney = models.IntegerField()
    comment = models.TextField(max_length=128)

我尝试使用get_queryset从URL中获取pk,并将pk传递给get_context_data,并在数据库中将具有该ID的特定卡车作为目标。

python django
1个回答
0
投票

首先,不需要创建truckID和reviewID主键字段,因为Django会自动为每个对象创建一个唯一的ID字段,您可以在其上简单地执行.get(id=1).filter(id=1)等。

就像将ID放在带有外键或任何关系字段的字段中完全没有用,因为Django会自动采用名称并在其后附加_id。例如,仅user将成为user_id,或者truck将成为后端的truck_id,例如,您可以在其上执行.get(user__id=1).get(user_id=1)

您应该查看代码的这一部分。您实际上不使用主键执行任何操作:

 def get_queryset(self):
    queryset = super().get_queryset()
    try:
       item = queryset.get(id=self.kwargs['pk'])
    except:
       ...
    else:
       # Do something with item here
       ...
    finally:
       return queryset

或带有get_context_data

  def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     queryset = super().get_queryset()

     try:
        item = queryset.get(id=kwargs['pk'])
     except:
        ...
     else:
        # Do something with item here
        context['item'] = item
     finally:
        return context
© www.soinside.com 2019 - 2024. All rights reserved.