Сохранение первичного ключа в представлении на основе классов в другое представление (django) - PullRequest
0 голосов
/ 02 июля 2018

Я не знаю, как вообще найти решение для этого, но давайте начнем с самого начала.

Это мои модели:

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 я хотел бы показать болезни, которые были у животного. В шаблоне AnimalDetailView есть ссылка на URL с Medhistorylistview. Моя главная проблема заключается в том, как сохранить первичный ключ из одного представления в другое и выбрать только эти объекты с указанием animal.pk. Как и MedicalHistory.objects.get (animal.pk = pk). Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Во-первых, удалите этот метод get_object() в AnimalDetailView. Он не делает ничего, кроме того, что вызывает совершенно бессмысленный запрос на обновление.

Теперь в вашем MedhistoryListView вы хотите установить набор запросов в качестве набора объектов, связанных с Animal, идентифицируемых PK в URL. Итак, определите метод get_queryset():

def get_queryset(self, *args, **kwargs):
    return MedicalHistory.objects.filter(animal_id=self.kwargs['pk'])
0 голосов
/ 02 июля 2018

Вы можете передать PK в качестве аргумента методу в представлении MedhistoryListView.

Внутри вашего шаблона есть следующая ссылка:
<a href="{% url 'app_name:animaldetail' id_to_pass_to_view %}">Link to view</a>

А затем внутри вашего views.py файла:

class MedhistoryListView(ListView):
    def get(self, request, pk):
        animal_history = MedicalHistory.objects.get(animal.pk=pk)
        # the animal_history object now contains the animal's medical history as stored in the database


Код в ссылке направляет пользователя к представлению животных и передает id id_to_pass_to_view в качестве аргумента методу get() внутри класса MedhistoryListView. Аргумент pk содержит первичный ключ, который был отправлен в URL-адресе и может затем использоваться для получения истории болезни животного.

...