2017-05-14 3 views
0

Ich weiß der Titel sagt, die Frage wurde zuvor gestellt, aber die Situation ist anders.Django begrenzen die Möglichkeiten einer viel zu viele Beziehung

Ich habe etwas Agent genannt:

class Agent(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='agents') 
    ... 

und ein Group:

class Group(models.Model): 
    agents = models.ManyToManyField('agents.Agent', blank=True, related_name='groups') 

jetzt mit Django Klasse basierte Ansichten (UpdateView vielleicht) Ich möchte eine Ansicht erstellen, dass ein Benutzer sehen nur seine Agenten und wählen Sie nur eine von ihnen zu fügen Sie es hinzu zu einer bestimmten Gruppe.

soweit ich war

@method_decorator(login_required, name='dispatch') 
class GroupAgentRegister(UpdateView): 
    model = Group 
    fields = ('agents',) 
    template_name = 'register.html' 
    context_object_name = 'group' 

    def get_form(self, form_class=None): 
     form = super(GroupAgentRegister, self).get_form(form_class) 
     form.fields['agents'].queryset = self.request.user.agents.all() 
     return form 

    def form_valid(self, form): 
     if self.object.agents.filter(user=self.request.user): 
      form.add_error(None, ValidationError(u'Already Registered')) 
      return super(GroupAgentRegister, self).form_invalid(form) 
     return super(GroupAgentRegister, self).form_valid(form) 

die Form Rendering außer in Ordnung ist, dass ich in der Lage mehrere Agenten zu wählen. , aber wenn ich einen Wert auswähle und ihn poste, ersetze er die neuen ausgewählten Agenten durch existierende und er wird nicht an die alten angehängt.

+0

Also hat eine Gruppe nur einen Agenten? – itzMEonTV

+0

@L_S-Nr. Eine Gruppe hat viele Agenten, aber ein Benutzer kann nur einen Agenten in jeder Gruppe registrieren. – mehdy

+0

Wie sieht Ihr Formular aus? –

Antwort

0

Ich löste es auf diese Weise. es kann anderen auch helfen.

zuerst habe ich eine Form:

class GroupRegistrationForm(forms.ModelForm): 
    agents = forms.ModelChoiceField(Group.objects.none()) 

    class Meta: 
     model = Group 
     fields = ('agents',) 

und ich änderte die Registeransicht dazu:

@method_decorator(login_required, name='dispatch') 
class GroupAgentRegister(UpdateView): 
    model = Group 
    form_class = GroupRegistrationForm 
    fields = ('agents',) 
    template_name = 'register.html' 
    context_object_name = 'group' 

    def get_form(self, form_class=None): 
     form = super(GroupAgentRegister, self).get_form(form_class) 
     form.fields['agents'].queryset = self.request.user.agents.all() 
     return form 

    def form_valid(self, form): 
     if self.object.agents.filter(user=self.request.user): 
      form.add_error(None, ValidationError(u'Already Registered')) 
      return super(GroupAgentRegister, self).form_invalid(form) 
     self.object.agents.add(form.cleaned_data['agents']) 
     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

und alles funktioniert mit den meisten minimale Änderung in Ordnung I anwenden musste.

Verwandte Themen