Как получить один объект модели с отношением к шаблону в Django - PullRequest
1 голос
/ 26 февраля 2020

Я работаю над этим проектом, чтобы добавить в шаблон две или более форм. Я могу получить две формы в шаблоне, но когда я отправляю форму, я получаю объекты для модели аренду имущества, а не модель контракта. Я создал два разных решения, но оба не решают проблему.

Первое решение, приведенное ниже, отображает оба объекта несколько раз в подробном представлении, но я хочу, чтобы два объекта модели отображались только один раз. Второе решение отображает объект rentalproperty один раз, а объекты контракта - несколько раз. Может ли кто-нибудь указать мне правильное направление? Спасибо.

Первое решение: views.py

class DetailView(generic.DetailView):
    model = RentalProperty
    template_name = 'rental/detail.html'
    context_object_name = 'property'



def new_rental(request, pk):
    if request.method == 'POST':
        rental_form = NewRentalPropertyForm(request.POST, request.FILES, prefix = "rentals")
        contract_form = NewContractForm(request.POST, prefix = "contracts")
        if rental_form.is_valid() and contract_form.is_valid():
            print ("all validation passed")
            rentalproperty = rental_form.save()
            contract_form.cleaned_data["rentalproperty"] = rentalproperty
            print(contract_form)
            contract = contract_form.save(commit=False)
            contract.rentalproperty = rentalproperty
            contract = contract_form.save()
            return HttpResponseRedirect(reverse("home"))
        else:
            messages.error(request, "Error")
            contract = Contract.objects.get(pk=pk)

    else: 
        rental_form = NewRentalPropertyForm(prefix = "rentals")
        contract_form = NewContractForm(prefix = "contracts")
        contract = Contract.objects.get(pk=pk)
    return render(request, 'rental/new_rental.html', {
        #'rentalproperty': rentalproperty,
    'rental_form': rental_form,
    'contract_form': contract_form,
    'contract': contract,

    })

detail. html

<h1>This is the detail view</h1>
    <h3>From landlord</h3>
    <p>Landlord: {{property.created_by}}</p>
    <p>address: {{property.landlord.address}}</p>

    <h3>From Rental property</h3>
    <ul>
        {% for rental in property.landlord.rentalpropertys.all %}
        <br>
        <li>Title: {{property.title}}</li>
    <img src="{{property.image.url}}" height="200" alt=""/>
    <li>created at: {{property.created_at}}</li>
    <li>Type of property: {{property.type_of_property_listing}}</li>
    <li>Street: {{property.street}}</li>
    <li>Borough: {{property.borough}}</li>
        <ul>
            {% for contract in rental.contracts.all %}
            <li> Insurance required: {{contract.insurance_required}}</li>
            <li> other terms: {{contract.other_terms}}</li>
            {% endfor %}
        </ul>
        {% endfor %}
    </ul>

Второе решение:

views.py

class DetailView(generic.DetailView):
    model = RentalProperty
    template_name = 'rental/detail.html'
    context_object_name = 'property'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['landlord']= Landlord.objects.all()
        context['contract']= Contract.objects.filter(rentalproperty__title=title).order_by('created_at')
        return context

Функция сообщения та же.

деталь. html

<h1>This is the detail view</h1>
    <h3>From landlord</h3>
    <p>Landlord: {{property.created_by}}</p>
    <p>address: {{property.landlord.address}}</p>

    <h3>From Rental property</h3>
    <ul>
        <li>Title: {{property.title}}</li>
        <img src="{{property.image.url}}" height="200" alt=""/>
        <li>created at: {{property.created_at}}</li>
        <li>Type of property: {{property.type_of_property_listing}}</li>
        <li>Street: {{property.street}}</li>
        <li>Borough: {{property.borough}}</li>

        </ul>

        <ul>
        {% for data in contract %}
        <li> insurance : {{data.insurance_required}}</li>
        <li> other terms: {{data.other_terms}}</li>
        {% endfor %}
        </ul>

Моя модель:

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='rentalpropertys', on_delete=models.CASCADE)
    created_by = models.ForeignKey(UserModel, related_name='rentalpropertys', on_delete=models.CASCADE)
    title = models.TextField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    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)
    image = models.ImageField(upload_to='images/', null=True, blank=True,)

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

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)

вывод первого решения:

адрес: Хельсинки Название: страховка сборок приложений: Да - это повторяется многократно.

Вывод второго решения:

адрес: Хельсинки Название: страховка сборок приложений: Да - страхование повторяется несколько раз

Что я ожидаю: адрес: Хельсинки Название: сборка приложений Страхование: Да

Спасибо за ваше время:)

1 Ответ

0 голосов
/ 26 февраля 2020

С помощью ответа @Timmy O'Mahony я сделал {% для контракта в property.contracts.all%} в своем шаблоне, используя первые решения, и это работает. Контракты - это связанное с арендной собственностью название. Спасибо всем.

...