将基于 class 的视图中的主键保存到另一个视图(django)
Saving primary key in class based view to another view (django)
我什至不知道如何找到解决方案,但让我们从头开始。
这些是我的模型:
class Animal(models.Model):
SPECIES = (
("DOG", "DOG"),
("CAT", "CAT"),
)
species = models.CharField(max_length=4, choices=SPECIES)
name = models.CharField(max_length=20)
weight = models.PositiveSmallIntegerField(null=False, blank=False)
age = models.PositiveSmallIntegerField(null=False, blank=False)
color = models.CharField(max_length=10)
isill = models.BooleanField(null=False)
isagressive = models.BooleanField(null=False)
isadopted = models.BooleanField(null=False)
isreturned = models.NullBooleanField()
whichbox = models.CharField(max_length=5)
photo = models.ImageField(null=True, blank=True)
def __str__(self):
return self.name
class MedicalHistory(models.Model):
animal = models.ForeignKey(Animal, on_delete=models.CASCADE)
disease = models.CharField(max_length=100)
medicine = models.CharField(max_length=20, null=True, blank=True)
therapy = models.CharField(max_length=50)
howmuchmed = models.CharField(max_length=50)
daterecord = models.DateField
def __str__(self):
return self.disease
这是我的 url:
urlpatterns = [
path('', AnimalListView.as_view(template_name='Animals/animals.html'), name='animallist'),
path('add/', AddAnimal.as_view(), name='addanimal'),
path('edit/<int:pk>/', EditAnimal.as_view(), name='editanimal'),
path('detail/<int:pk>/', AnimalDetailView.as_view(template_name='Animals/animaldetail.html'), name='animaldetail'),
path('medlist/<int:pk>/', MedhistoryListView.as_view(template_name='Animals/medlist.html'), name='medlist'),
]
和我的观点(只有两个)
class AnimalDetailView(DetailView):
queryset = Animal.objects.all()
def get_object(self):
object = super().get_object()
object.save()
return object
context_object_name = 'animal_detail'
class MedhistoryListView(ListView):
"PLACE FOR CODE"
context_object_name = 'medical_history_list'
在 MedhistoryListView 中,我想显示动物患有的疾病。有 link on AnimalDetailView 模板到 url with Medhistorylistview。我的主要问题是如何将主键从一个视图保存到另一个视图,并仅选择指定 animal.pk 的这些对象。就像 MedicalHistory.objects.get(animal.pk=pk)。谁能帮帮我?
首先,删除 AnimalDetailView 中的 get_object()
方法。除了导致完全无意义的更新查询外,它什么都不做。
现在,在您的 MedhistoryListView 中,您希望将查询集设置为与 URL 中的 PK 标识的 Animal 相关的对象集。因此,定义 get_queryset()
方法:
def get_queryset(self, *args, **kwargs):
return MedicalHistory.objects.filter(animal_id=self.kwargs['pk'])
我什至不知道如何找到解决方案,但让我们从头开始。
这些是我的模型:
class Animal(models.Model):
SPECIES = (
("DOG", "DOG"),
("CAT", "CAT"),
)
species = models.CharField(max_length=4, choices=SPECIES)
name = models.CharField(max_length=20)
weight = models.PositiveSmallIntegerField(null=False, blank=False)
age = models.PositiveSmallIntegerField(null=False, blank=False)
color = models.CharField(max_length=10)
isill = models.BooleanField(null=False)
isagressive = models.BooleanField(null=False)
isadopted = models.BooleanField(null=False)
isreturned = models.NullBooleanField()
whichbox = models.CharField(max_length=5)
photo = models.ImageField(null=True, blank=True)
def __str__(self):
return self.name
class MedicalHistory(models.Model):
animal = models.ForeignKey(Animal, on_delete=models.CASCADE)
disease = models.CharField(max_length=100)
medicine = models.CharField(max_length=20, null=True, blank=True)
therapy = models.CharField(max_length=50)
howmuchmed = models.CharField(max_length=50)
daterecord = models.DateField
def __str__(self):
return self.disease
这是我的 url:
urlpatterns = [
path('', AnimalListView.as_view(template_name='Animals/animals.html'), name='animallist'),
path('add/', AddAnimal.as_view(), name='addanimal'),
path('edit/<int:pk>/', EditAnimal.as_view(), name='editanimal'),
path('detail/<int:pk>/', AnimalDetailView.as_view(template_name='Animals/animaldetail.html'), name='animaldetail'),
path('medlist/<int:pk>/', MedhistoryListView.as_view(template_name='Animals/medlist.html'), name='medlist'),
]
和我的观点(只有两个)
class AnimalDetailView(DetailView):
queryset = Animal.objects.all()
def get_object(self):
object = super().get_object()
object.save()
return object
context_object_name = 'animal_detail'
class MedhistoryListView(ListView):
"PLACE FOR CODE"
context_object_name = 'medical_history_list'
在 MedhistoryListView 中,我想显示动物患有的疾病。有 link on AnimalDetailView 模板到 url with Medhistorylistview。我的主要问题是如何将主键从一个视图保存到另一个视图,并仅选择指定 animal.pk 的这些对象。就像 MedicalHistory.objects.get(animal.pk=pk)。谁能帮帮我?
首先,删除 AnimalDetailView 中的 get_object()
方法。除了导致完全无意义的更新查询外,它什么都不做。
现在,在您的 MedhistoryListView 中,您希望将查询集设置为与 URL 中的 PK 标识的 Animal 相关的对象集。因此,定义 get_queryset()
方法:
def get_queryset(self, *args, **kwargs):
return MedicalHistory.objects.filter(animal_id=self.kwargs['pk'])