我正在用ModelForms在Django中编写一个预订系统,我想在表单保存时更改ForeginKey模型中布尔字段的值.

Models.py

class AvailableHours(models.Model):
    free_date = models.ForeignKey(AvailableDates, null=True, blank=True,on_delete=models.CASCADE)
    free_hours_from = models.CharField(max_length=10,null=True, blank=True)
    free_hours_to = models.CharField(max_length=10,null=True, blank=True)
    status = models.BooleanField(null=True,default=True)

class Bookings(models.Model):   
...
    booked_time = models.ForeignKey(AvailableHours, on_delete=models.CASCADE,related_name='booked_time')
   

Views.py

@login_required()
def booking_form(request):
    form = forms.BookingForm()
    if request.method == 'POST':
        form = forms.BookingForm(request.POST)
        if form.is_valid():
            book = form.save(commit=False)
            book.user = request.user
            form.save()
            return HttpResponseRedirect(reverse('creator:login'))
    return render(request, 'account/book.html', {'form': form})

Forms.py

class BookingForm(forms.ModelForm):
    class Meta:
        model = Bookings
        exclude = ('user','booking_code','confirmed',)

由于我希望每个可用小时只能预订一次,我需要表单将可用小时状态的值更改为假,以便我可以在模板中过滤它.

有谁能提出一个解决这个问题的方法吗?

我试过像这样的东西

form.booked_time.status = False

在我看来,但这并不管用

推荐答案

你可以使用Django signals,它提供了一种处理事件的便捷方式.

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Bookings

@receiver(post_save, sender=Bookings)
def update_available_hours_status(sender, instance, created, **kwargs):
    if created:
        # If a new Booking is created
        booked_time = instance.booked_time
        booked_time.status = False
        booked_time.save()

Reference

Django相关问答推荐

使用override_sets构建一个预装饰的类,以更快的客户端.登录?

仅更新模型中的特定字段.Model Django

Django:如何 Select 没有其他项目引用的项目?

为什么 timezone.now 在作为默认值应用于 Django 中的 DateField 时显示future 日期

在Django测试get方法中获取HttpResponseNotFound

AttributeError:'Manager'对象在Django中没有属性'get_by_natural_key'错误?

未捕获的类型错误:$(...).datepicker is not a function(anonymous function)

如何在 forms.Form 子类上动态设置 models.ModelChoiceField 的查询集

Django - 强制执行 ManyToManyField 唯一项

在 django 中获取本地时区

模型中的外键

创建新内容类型时出错.请确保在try 单独迁移应用程序之前迁移内容类型

CherryPy 与 Django

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

Django ALLOWED_HOSTS IP 范围

登录后django重定向不起作用next不发布?

Django:如何将数据保存到 ManyToManyField?

如何过滤(或替换)在 UTF-8 中占用超过 3 个字节的 unicode 字符?

ModelForm 上的 Django 和字段集

我将如何package打包和销售 Django 应用程序?