Как получить доступ к однозначным значениям из представлений в Django? - PullRequest
0 голосов
/ 15 мая 2018

Итак, у меня есть модель KeyRequest и модель KeyInstance.Один KeyRequest может относиться только к одному KeyInstance, наоборот.И у каждого KeyInstance есть uuid и status.Я хотел бы получить доступ к этому uuid и количеству доступных ключей в KeyRequest

Вот мои модели.py:

class KeyInstance(models.Model):

    keyrequest = models.OneToOneField('KeyRequest', verbose_name='Key requests', on_delete=models.SET_NULL, null=True, blank=True, related_name='request')

    LOAN_STATUS = (
        ('a', 'Available'),
        ('o', 'On loan'),
        ('r', 'Reserved'),
    )

    status = models.CharField(max_length=1, choices=LOAN_STATUS, help_text='Key availability', verbose_name="Key status", blank=True)

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="Unique ID for this particular key")

    class Meta:
        ordering = ["due_back"]
        permissions = (("can_mark_returned", "Set key as returned"),)

    @property
    def is_overdue(self):
        if self.due_back and date.today() > self.due_back:
            return True
        return False

    def __str__(self):
        """
        String for representing the Model object
        """
        return '{1} ({0})'.format(self.id,self.roomkey.room_name)

    def get_absolute_url(self):
        """
        Returns the url to access a detail record for this book.
        """
        return reverse('keys',args={'pk':self.id})

...

class KeyRequest(models.Model):
    """
    Model that will hold the key requests
    """
    roomkey = models.ForeignKey('RoomKey',verbose_name="Room", on_delete=models.SET_NULL, null=True)

    def __str__(self):
        """
        String for representing the Model object
        """
        return '{2}-{0} ({1})'.format(self.roomkey.room_name, self.date_requested, self.requester)

    def get_absolute_url(self):

        return reverse('key-request-detail', args=[str(self.id)])

Вот мой views.py:

class KeyRequestDetailView(generic.DetailView):
    model = KeyRequest
    template_name = "catalog/roomkey_request_detail.html"

    def RequestDetail(request):
        num_keyinstances_available = KeyInstance.objects.filter(status__exact='a').count()

        return render(
            request,
            'key-request-detail',
            context = {'num_key_available':num_keyinstances_available},
        )

Вот мой шаблон

{{ keyrequest.request.id }}

{{ num_key_available }}

Может кто-нибудь сказать мне правильный способ сделать это?

1 Ответ

0 голосов
/ 15 мая 2018

Посмотрите, что вы можете сделать из этого.Я уверен, что это как-то укажет вам правильное направление.Слишком долго для комментария.Все в контекстном словаре будет доступно в вашем шаблоне.Вы можете поместить в контекстный словарь столько вещей, сколько захотите.

class KeyRequestDetailView(generic.DetailView):
    model = KeyRequest
    template_name = "catalog/roomkey_request_detail.html"

    def get_object(self, queryset=None):
        pk = self.kwargs.get('pk', None) # I assume you're using pk to lookup the KeyRequest
        keyrequest_instance = KeyRequest.objects.get(pk=pk)
        # But if there is no such keyrequest instance you have to handle the error somehow

        context = {}
        context['keyrequest'] = keyrequest_instance # the actual keyrequest
        context['num_key_available'] = KeyInstance.objects.filter(status__exact='a').count() # total number of 'available' keys
        key_request_id = keyrequest_instance.keyinstance.id # id of each keyrequest reference from the instance it is tied to
        key_request_status = keyrequest_instance.keyinstance.status # status of each keyrequest reference from the instance it is tied to

        return render(request, "catalog/roomkey_request_detail.html", context)
...