覆盖 Django 管理保存模型

问题描述 投票:0回答:1

我想重写 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)

但运气不佳。

有人有解决办法吗?

django django-forms django-admin
1个回答
1
投票

使用此代码

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)
© www.soinside.com 2019 - 2024. All rights reserved.