2009-07-20 5 views
1

J'utilise actuellement inlineformset_factory pour obtenir un formset avec Holidays pour une personne, mais je souhaite uniquement afficher les objets Holiday qui sont dans le futur.Filtrage d'éléments dans InlineFormset

HolidaysFormset = inlineformset_factory(Person, Holiday) 

Au sein de la classe Person, il est facile d'obtenir les prochaines vacances:

def future_holidays(self): 
    return self.holidays.filter(end__gte=datetime.date.today()) 

J'ai regardé le code source correspondant, et l'formfield_callback avait l'air un peu prometteur, mais qui est seulement appelé à un par champ, et ne peut pas être utilisé (je pense) pour limiter les objets qui correspondent.

Des suggestions? Serai-je mieux de créer mon propre FormSet, ou une sous-classe de vacances? Ou devrais-je envisager d'utiliser un gestionnaire personnalisé?

Répondre

0

Une solution consiste à fournir une nouvelle classe de base FormSet, avec la méthode .get_queryset() substituée.

class BaseFutureHolidaysFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     return BaseInlineFormSet.get_queryset(self).filter(
        finish__gte=datetime.date.today() 
     ) 

Utilisez ensuite ceci dans la méthode de création:

HolidaysFormSet = inlineformset_factory(Person, Holiday, 
    formset=BaseFutureHolidaysFormSet) 

Cela fonctionne, comme prévu.

(Oh, un merci à The Nested Float, car ce type de solution est discuté là-bas.)

0

Cette solution ne fonctionne pas pour moi - je n'ai des messages d'erreur étranges.

Ma solution dans Django 1.1 (dans mon application, pas dans l'application d'administration) était de revenir au modèle de base FormSet, qui prend en charge la limitation du jeu de queues: http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#changing-the-queryset.

Par exemple:

MyFormSet = modelformset_factory(MyModel) 

et

myformset = MyFormSet(queryset=MyModel.objects.exclude(..criteria here..).filter(document=object_id)) 

J'ai aussi essayé plusieurs façons de plus d'équitation classe BaseInlineFormset, mais aucun travaillé.

Bien que cela fonctionne, dans mon projet, simplifier le modèle pourrait être une meilleure solution.

+0

Quelle sorte d'erreurs? –