python - Django ModelForm Field Filtering with multiple model dependancies -
i have member model , group model foreign key member
class member(models.model): member_name = models.charfield(max_length=100) member_dob = models.datefield() class group(models.model): group_name = models.charfield(max_length=100) group_owner = models.foreignkey(member, related_name='owner') group_members = models.manytomanyfield(member, related_name='members') and have created model, activity refer both group , member
class activity(models.model): group_id = models.foreignkey(group) topic = models.charfield(max_length=100) start_by = models.foreignkey(member, related_name='started') participants = models.manytomanyfield(member, related_name='participants') now have created modelform acivity
class activityform(modelform): class meta: model = activity if have used object of activityform in template, users loaded in participants 'select' input. wish display members belonging group(with id= self.group_id) displayed in select option.
can please me in writing queryset include in init function of activityform that?
shouldn't member have foreign key group? want have many members in group not many groups single member right?
class member(models.model): name = models.charfield(max_length=100) dob = models.datefield() group = modes.foreignkey('group', related_name='members') class group(models.model): name = models.charfield(max_length=100) owner = models.foreignkey('member', related_name='owned_groups') class activity(models.model): group = models.foreignkey('group', related_name='activities') topic = models.charfield(max_length=100) start_by = models.foreignkey('member', related_name='started_activities') participants = models.manytomanyfield('member', related_name='participating_activities') and can do:
class activityform(modelform): def __init__(self, *args, **kwargs): super(activityform, self).__init__(*args, **kwargs) if 'initial' in kwargs: self.fields['participants'].queryset = member.objects.filter(group=initial.group) class meta: model = activity edit
with change using manytomanyfield recommend fixing field names , related names too. easier make changes in development process rather when run different problem can't fixed. if makes easier understand think of way: related name accessible on model foreignkey or manytomanyfield points , contain queryset 0 or more entries.
so if have...
class member(models.model): name = models.charfield(max_length=100) dob = models.datefield() class group(models.model): name = models.charfield(max_length=100) owner = models.foreignkey('member', related_name='owned_groups') members = models.manytomanyfield('member', related_name='groups') class activity(models.model): group = models.foreignkey(group) topic = models.charfield(max_length=100) start_by = models.foreignkey('member', related_name='started_activities') participants = models.manytomanyfield('member', related_name='activities') then can things like...
g1 = group.objects.create(name='group 1', ...) g2 = group.objects.create(name='group 2', ...) member = member.objects.get(name='john') member.groups.all() # groups member member.groups.add(g1, g2) # add member 2 groups member.activities.all() # activities member participant in member.started_activities.all() # activities started user and form...
class activityform(modelform): ... def __init__(self, *args, **kwargs): super(activityform, self).__init__(*args, **kwargs) if 'initial' in kwargs: self.fields['participants'].queryset = initial.group.members.all() class meta: model = activity i think work, if not:
class activityform(modelform): ... def __init__(self, *args, **kwargs): super(activityform, self).__init__(*args, **kwargs) if 'initial' in kwargs: self.fields['participants'].queryset = member.objects.filter(group__id=initial.group.id) class meta: model = activity
Comments
Post a Comment