Джанго - Связывание моделей друг с другом - PullRequest
1 голос
/ 10 октября 2019

Как часть задачи, я создал веб-сайт «списки квартир». Мне удалось это сделать, но теперь мне нужно создать «систему бронирования» для этого. Основная идея состоит в том, что вошедший в систему пользователь может выбрать квартиру из перечисленных квартир, выбрать «start_date» и «end_date» (если квартира уже не забронирована) и забронировать квартиру. Я новичок в Django, и мне нужно несколько указателей, чтобы начать где-нибудь с этой задачей. У меня есть модель квартиры, которая содержит всю информацию о квартирах, которую я использую для распечатки всего с помощью шаблона.

Я использую предоставленные пользовательские модели django для регистрации / входа. Я использую Django 2.1.8

. Я создал этот вид и модель для бронирования:

вид:

def apartment_view(request, apartment_id):

    apartment = get_object_or_404(Apartment, pk=apartment_id)
    context = {'apartment': apartment, }
    context_instance = RequestContext(request)

    form = ReservationForm()
    if request.method == 'GET':
        form = ReservationForm()

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid:
            form.save()
            # to go back to check that the info has changed
            return HttpResponseRedirect('/booking/')
    args = {}
    args['form'] = form
    return render(request, 'booking/index.html', args)

модели:


class Apartment(models.Model):
    title = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    zipcode = models.CharField(max_length=20)
    description = models.TextField(blank=True)
    price = models.IntegerField()
    bedrooms = models.IntegerField()
    bathrooms = models.DecimalField(max_digits=2, decimal_places=1)
    garage = models.IntegerField(default=0)
    size = models.IntegerField()
    photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/')
    photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
    photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
    photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
    photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
    in_rent = models.BooleanField(default=False)
    list_date = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.title

class Reservation(models.Model):
    apartment = models.ForeignKey(Apartment, related_name='reservations',
                                  on_delete=models.CASCADE, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)

    def __str__(self):
        return "Reservation"

мои URL:

app_name = "booking"
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:apartment_id>/', views.apartment_view, name='apartment'),
    path('apartments/', views.ApartmentsView.as_view(), name='apartments'),
    # path('reservation/', views.CreateReservationView.as_view(), name='reservation'),
    path('search/', include('haystack.urls',)),

]

Таким образом, я могу создать резервирование, но моя проблема в том, что резервирование автоматически не «подключается» к фактическому списку квартир, и я хочу, чтобы оно было связанос ним.
Если я захожу в администратор django, я вижу созданную бронь, но мне нужно вручную добавить в нее квартиру.

Как я могу сделать это, чтобы она была автоматической?

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Вам просто нужно прикрепить его при бронировании, как показано ниже.

if form.is_valid():
    reservation = form.save(commit=False)
    reservation.apartment = apartment
    reservetion.save()
    # to go back to check that the info has changed
0 голосов
/ 10 октября 2019

Если вы используете ModelForm для бронирования, вы сможете выбрать квартиру, и она будет сохранена автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...