2

私はdjango-nested-inlinesを使用して、これら 3 つのモデルの管理者にネストされたインラインを提供しています。

class Venue(models.Model):
    name = models.CharField(max_length=100)

class VenueBookingSetting(models.Model):
    venue = models.ForeignKey(Venue)
    name = models.CharField(max_length=100, default='')
    use_date_range = models.BooleanField(default=False)
    use_valid_days = models.BooleanField(default=False)
    days_in_advance = models.SmallIntegerField(default=DEFAULT_DIA)
    max_covers = models.SmallIntegerField(default=0, blank=True)
    active = models.BooleanField(default=False)

class VenueValidBookingDays(models.Model):
    booking_setting = models.ForeignKey(VenueBookingSetting)
    sunday = models.BooleanField(default=True)
    monday = models.BooleanField(default=True)
    tuesday = models.BooleanField(default=True)
    wednesday = models.BooleanField(default=True)
    thursday = models.BooleanField(default=True)
    friday = models.BooleanField(default=True)
    saturday = models.BooleanField(default=True)

これは、Venue の私の管理者設定です。

class VenueBookingValidDaysInline(NestedTabularInline):
    model = VenueBookingValidDays

class VenueBookingSettingInline(NestedTabularInline):
    model = VenueBookingSetting
    inlines = [VenueBookingValidDaysInline,]

class VenueAdmin(NestedModelAdmin):
    inlines = [VenueBookingSettingInline,]

私が抱えている問題は、親の予約設定を入力せずに予約日を追加した場合に IntegrityError をキャッチする場所ですか? つまり、有効な日のいくつかのチェックを外しますが、親の予約設定項目は変更しません。ページが 500 エラーでクラッシュするのではなく、検証メッセージを表示するためにそのエラーをキャッチする必要がある場所を教えてもらえますか?

4

1 に答える 1

0

私はこれを解決しました。次のフォームセットのクリーンメソッドをオーバーライドする必要がありましたVenueBookingSettingInline

class VenueBookingSettingInlineFormset(BaseNestedInlineFormSet):
    def clean(self):
        '''
        Ensure that any newly added nested form has a prent which has been completed,
        otherwise an IntegrityError will be raised causing a 500 error
        '''
        if any(self.errors):
            # Don't bother validating the formset unless each form is valid on its own
            return
        for form in self.forms:
            # if this form is a new addition (i.e. it has changed but it has no
            # id) then we need to save it and add it to the nested forms
            for nested_formset in form.nested_formsets:
                for nested_form in nested_formset:
                    if (nested_form.has_changed() and nested_form.instance.id is None and
                                        not form.has_changed() and form.instance.id is None):
                        raise forms.ValidationError('Please ensure you add a %s when adding a %s'
                            % (form._meta.model.__name__, nested_form._meta.model.__name__))

class VenueBookingSettingInline(NestedTabularInline):
    model = VenueBookingSetting
    inlines = [VenueBookingValidDaysInline,]
    formset = VenueBookingSettingInlineFormset

誰かがより良いまたはよりクリーンなソリューションを持っている場合は、投稿してください。

于 2013-10-03T10:39:13.433 に答える