10

次のようなモデルがあります。

class Event(models.Model):
    event_dates = ManyToManyField("EventDate")
    #...

class EventDate(models.Model):
    event_date = DateField()
    #...

ただし、 の event_dates に対して表示される django 管理MultipleSelectフォーム フィールドでは、クエリEventAdminセットを過去ではない event_dates に制限したいと思います。

クエリセットは次のようになります。

event_date_queryset = EventDate.objects.filter(event_date__gte = datetime.date.today()) 

しかし、過去以外の日付のみがフィールドに表示されるようにするには、このクエリセットをどこで設定できますか?

(現在、 のカスタム フォームはありませんが、EventAdmin喜んで追加します。)

4

2 に答える 2

26

あなたは試すことができます:

event_dates = models.ManyToManyField("EventDate", limit_choices_to={'event_date__gte': date.today()})

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_toから取得

ただし、過去の一部の日付がまだ に関連付けられている場合でも、将来の日付のみが表示されEventます。

以前に関連付けたすべての日付も必要な場合は、次のようにEvent操作できますModelForm

from datetime import date

from django.contrib import admin
from django import forms
from django.db.models import Q

from models import Event, EventDate

class EventAdminForm(forms.ModelForm):
    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        super(EventAdminForm, self).__init__(*args, **kwargs)
        if 'event_dates' in self.initial:
            self.fields['event_dates'].queryset = EventDate.objects.filter(Q(pk__in=self.initial['event_dates']) | Q(event_date__gte=date.today()))
        else:
            self.fields['event_dates'].queryset = EventDate.objects.filter(event_date__gte=date.today())

class EventAdmin(admin.ModelAdmin):
    form = EventAdminForm
    filter_horizontal = ['event_dates']
于 2013-05-22T06:42:28.123 に答える