Как изменить поле в родительском классе при создании полей охлажденного класса в forms.py и views.py? - PullRequest
1 голос
/ 10 октября 2019

Я создаю ModelForm. Я пытаюсь изменить родительский класс, сохраняя поля дочернего класса в базе данных, в файле views.py, который я сделал, но он не сохранился в базе данных. вот мой model.py

class Table(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    book = models.BooleanField(default=False)

class People(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    taple = models.OneToOneField(Table, on_delete=models.CASCADE, null=True, blank=True)

@receiver(post_save, sender=User)
def update_people_profile(sender, instance, created, **kwargs):
    try:
        instance.people.save()
    except ObjectDoesNotExist:
        People.objects.create(user=instance)

Класс People - это дочерний класс, а Table - родительский класс, поэтому я использую класс People для создания форм. Вот мой файл forms.py

class Booking(forms.ModelForm):

    class Meta:
        model = People
        fields = [
            'taple',
        ]

Итак, я хочу создать True поле книги в классе таблицы и сохранить его в базе данных при сохранении формы бронирования. вот мои views.py

def booking(request):
    if request.method == 'POST':
        try:
            people_instance = People.objects.get(user=request.user)
        except Table.DoesNotExist:
            people_instance = People(user=request.user)
        form = Booking(request.POST, instance=people_instance)
        if form.is_valid():
            user = form.save(commit=False)
            user.taple.booking = True
            user.refresh_from_db()
            user.user = request.user
            user.taple = form.cleaned_data.get('taple')
            user.save()
            print(user.taple.booking, user.taple.id)
            return redirect('booked')
    else:
        form = Booking()
    return render(request, 'main/booking.html', {'form': form})

Любая идея?

1 Ответ

1 голос
/ 11 октября 2019

Что я понимаю из фрагментов, так это то, что вы хотите иметь возможность записи, если таблица забронирована (закажите Boolean Field в вашей модели Table и, если да, то кем, который является объектом вашей модели People.

Если мое понимание верно, то я не думаю, что вам действительно нужна таблица объединения (модель People). Вместо этого я бы изменил вашу модель следующим образом:

class Table(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    booked_by = models.OneToOneField(User, null=True, on_delete=models.SET_NULL, related_name='table_booked')

    @property
    def is_booked(self):
        # This returns True if booked_by is set, False otherwise
        return self.booked_by_id is not None

Таким образом, вы не будетенужна модель People. Декоратор свойств позволит вам использовать is_booked в качестве вычисляемого поля. Также обратите внимание на связанное имя, которое будет использоваться в форме:

class BookingForm(forms.ModelForm):
    table_booked = forms.ModelChoiceField(queryset=Table.objects.filter(booked_by__isnull=True))
    class Meta:
        model = User
        fields = ['table_booked',]

В форме вы увидите, чтомы определяем пользовательский набор запросов для table_booked. Цель состоит в том, чтобы фильтровать только свободные таблицы.

Тогда можно надеяться также упростить свое представление следующим образом:

Обновление: поскольку table_booked является обратным иностраннымключ, нам на самом деле нужно сохранить объект таблицы, который содержит отношение. Вот измененное представление:

@login_required
def booking(request):
    form = BookingForm(request.POST or None, instance=request.user)
    if form.is_valid():
        user = form.save(commit=False)
        tbl = form.cleaned_data['table_booked']
        tbl.booked_by = request.user
        tbl.save()
        user.save()
        print(request.user.table_booked.id, request.user.table_booked.is_booked)
        return redirect('/')
    return render(request, 'booking/booking.html', {'form': form})

Примечание: я не проверял код, поэтому может быть некоторыеопечатки, но это должно помочь вам начать работу.

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