我想重写 Django 表单保存方法以便能够一次创建多个对象。
我有一个可用时间模型:
class AvailableHours(models.Model):
free_date = models.ForeignKey(AvailableDates,null=True, blank=True,on_delete=models.CASCADE,related_name='freedate')
free_hours_from = models.IntegerField(null=True, blank=True)
free_hours_to = models.IntegerField(null=True, blank=True,)
status = models.BooleanField(null=True,default=True,)
我有一个此类的模型表格:
class TimeGenerator(forms.ModelForm):
class Meta:
model = AvailableHours
fields = ['free_date','free_hours_from','free_hours_to','status']
def save(self, commit=True):
base_item = super().save(commit=False)
frm = self.cleaned_data['free_hours_from']
to = self.cleaned_data['free_hours_to']
items = [
AvailableHours(
free_date=base_item.free_date,
status=base_item.status,
free_hours_from=hour,
free_hours_to=hour + 1,
)
for hour in range(frm, to)
]
if commit:
AvailableHours.objects.bulk_create(items)
return items
我想创建多个AvailableHours对象,如下所示:如果表单设置 free_hours_from = 13 和 free_hours_to=16 那么 save 方法创建 13-14 , 14-15, 15-16 我通过覆盖 ModelForm 实现了这一点,但现在我想覆盖 Admin Save 模型以从 Django Admin 执行此操作。
我尝试在 admin.py 中这样做
class AvailableHoursAdmin(admin.ModelAdmin):
def save_model(self, commit=True):
base_item = super().save(commit=False)
frm = self.cleaned_data['free_hours_from']
to = self.cleaned_data['free_hours_to']
items = [
AvailableHours(
free_date=base_item.free_date,
status=base_item.status,
free_hours_from=hour,
free_hours_to=hour + 1,
)
for hour in range(frm, to)
]
if commit:
AvailableHours.objects.bulk_create(items)
return items
admin.site.register(AvailableHours,AvailableHoursAdmin)
但运气不佳。
有人有解决办法吗?
使用此代码
from django.contrib import admin
from .models import AvailableHours
class AvailableHoursAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
# Call the parent class's method to handle the default save logic
super().save_model(request, obj, form, change)
frm = obj.free_hours_from
to = obj.free_hours_to
# Create AvailableHours objects based on the range of hours
if frm is not None and to is not None:
items = [
AvailableHours(
free_date=obj.free_date,
status=obj.status,
free_hours_from=hour,
free_hours_to=hour + 1,
)
for hour in range(frm, to)
]
AvailableHours.objects.bulk_create(items)
admin.site.register(AvailableHours, AvailableHoursAdmin)