Как получить данные в модели Django, используя связанные имя и общие c подробные представления - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь отобразить данные из одной из моих моделей в DetailView, используя связанное имя, определенное в модели. Это работает для модели Аренда недвижимости, но не работает для модели контракта. В чем может быть проблема?

Небольшой контекст того, чего я пытаюсь достичь. Чтобы получить значение атрибута модели аренды, я использую для l oop на landlord.rentalproperty.all; аренда недвижимости была родственным названием для модели арендодателя. Это отлично работает.

Когда у меня возникает проблема, когда я использую имя, связанное с моделью контракта, для rentalproperty, это не работает. Как я могу это исправить? Спасибо.

моя модель:

UserModel = get_user_model()

class Landlord(models.Model):
    user = models.OneToOneField(UserModel, on_delete=models.CASCADE)
    address = models.CharField(max_length=255)

    def __str__(self):
        return str(self.address)


class RentalProperty(models.Model):
    landlord = models.ForeignKey("Landlord", related_name='rentalproperty', on_delete=models.CASCADE)
    created_by = models.ForeignKey(UserModel, related_name='rentalproperty', on_delete=models.CASCADE)

    PROPERTY_LISTING_CHOICES = Choices(
        ('APARTMENT', _('Apartment')),
        ('HOLIDAY_HOME', _('Holiday home')),
        ('SINGLE_FAMILY_HOME', _('Single family home')),
        ('COMMERCIAL', _('Commercial')),
    )
    type_of_property_listing = models.CharField(
        max_length = 50,
        choices = PROPERTY_LISTING_CHOICES,
        default = PROPERTY_LISTING_CHOICES.APARTMENT,)

    street = models.CharField(max_length=255)
    borough = models.CharField(max_length=255)

    def __str__(self):
        return str(self.type_of_property_listing)

class Contract(models.Model):
    rentalproperty = models.ForeignKey("RentalProperty", related_name='contracts', on_delete=models.CASCADE)
    insurance_required = models.BooleanField(default=True)
    other_terms = models.TextField(blank=True)

    def __str__(self):
        return str(self.insurance_required)

Моя html:

 <h1>This is the detail view</h1>
    <h3>From landlord</h3>
    <p>Address: {{landlord.address}}</p>
    <h3>From Rental property</h3>
    <ul>
    {% for rental in landlord.rentalproperty.all %}
    <li>landlord: {{rental.landlord}}</li>
    <li>createdby: {{rental.created_by}}</li>
    <li>Type of property: {{rental.type_of_property_listing}}</li>
    <li>Street: {{rental.street}}</li>
    <li>Borough: {{rental.borough}}</li>
    {% endfor %}
    </ul>

    <ul>
    {% for contract in rentalproperty.contracts.all %}
    <li> rental property: {{contract.rentalproperty}}</li>
    {% endfor %}
    </ul>

Моя информация Просмотр.

class DetailView(generic.DetailView):
    model = Landlord
    template_name = 'rental/detail.html'

1 Ответ

1 голос
/ 20 февраля 2020

Вот DetailView представление:

class RentalPropertyDetailView(DetailView):
    context_object_name = 'property'
    model = models.RentalProperty

Обратите внимание на атрибут "context_object_name".

Во-вторых, ваш шаблон немного сбивает с толку. Вы хотите l oop для одного арендодателя, перечисляя имя арендодателя снова для каждого из его арендуемых свойств. И то же самое для каждого контракта?

Вот шаблон rentalproperty_detail.html:

<h1>This is the detail view</h1>
<h3>From landlord: {{ property.created_by }}</h3>
<p>Address: {{ property.landlord.address }}</p>
<h3>From Rental property</h3>
<ul>
    {% for rental in property.landlord.rental_properties.all %}
    <br>
    <li>createdby: {{rental.created_by}}</li>
    <li>Type of property: {{rental.type_of_property_listing}}</li>
    <li>Street: {{rental.street}}</li>
    <li>Borough: {{rental.borough}}</li>
    <ul>
        {% for contract in rental.contracts.all %}
        <li> Insurance required: {{contract.insurance_required}}</li>
        {% endfor %}
    </ul>
    {% endfor %}
</ul>

Теперь models.py:

class RentalProperty(models.Model):
    landlord = models.ForeignKey("Landlord", related_name='rental_properties', on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    PROPERTY_LISTING_CHOICES = [
        ('APARTMENT', ('Apartment')),
        ('HOLIDAY_HOME', ('Holiday home')),
        ('SINGLE_FAMILY_HOME', ('Single family home')),
        ('COMMERCIAL', ('Commercial')),
    ]
    type_of_property_listing = models.CharField(
            max_length = 50,
            choices = PROPERTY_LISTING_CHOICES,
            default = 'APARTMENT',
        )

    street = models.CharField(max_length=255, default=None, null=True)
    borough = models.CharField(max_length=255, default=None, null=True)

    def __str__(self):
        return str(self.type_of_property_listing)


class Contract(models.Model):
    rental_property = models.ForeignKey("RentalProperty", related_name='contracts', on_delete=models.CASCADE)
    insurance_required = models.BooleanField(default=True)
    other_terms = models.TextField(blank=True)

    def __str__(self):
        return str(self.insurance_required)

Модель Landlord Я оставил то же самое.

В urls.py вы должны получить один (1) RetailProperty, например:

url(r'^property/(?P<pk>\d+)$', views.RentalPropertyDetailView.as_view(), name='property-detail'),

Это выведет следующее:

enter image description here

...