CBV Wie man anfängliche Formulardaten vom Modell festlegt?

I ended up using get_initial as it was mentioned here How to subclass django's generic CreateView with initial data?

So sah meine Sicht so aus:

 class VlanFormView(FormView):
    template_name = 'vlan_form.html'
    model = Vlan
    form_class = VlanForm

    def get_initial(self):
        initial = {}
        default_vlan = Vlan.objects.get(pk=1)
        initial['vlan_name'] = default_vlan.vlan_name
        initial['vlan_number'] = default_vlan.vlan_number
        return initial

    def get_success_url(self):
        self.group = get_object_or_404(Group, group=self.kwargs['groupname'])
        # Redirect to vlan list
        return '/ipmgmt/%s/vlans/' % self.group

Ich suche nach einem vorgefüllten Formular, das auf einer Vorlage der eingegebenen Daten basiert.

Also basiert meine Vorlage auf dem ersten Eintrag in der Vlan-Tabelle, die 1 ist ...

Ich habe versucht, die Instanz in der form_class zu setzen:

form_class = VlanForm(instance=Vlan.objects.get(pk=1))

Ich erhalte einen TypeError:

'VlanForm' object is not callable

Etwas sagt mir, dass ich das CBV nicht richtig verwende, wie kann ich meine Anfangsdaten einstellen? Vielen Dank

Mein Modell:

 class Vlan(models.Model):
    vlan_name = models.CharField(max_length=30)
    vlan_number = models.CharField(max_length=6)
    group = models.ForeignKey(Group)

Meine Form:

class VlanForm(forms.ModelForm):
    class Meta:
        model = Vlan

Meine Sicht:

class VlanFormView(FormView):
    template_name = 'vlan_form.html'
    model = Vlan
    form_class = VlanForm(instance=Vlan.objects.get(pk=1))

    def get_success_url(self):
        self.group = get_object_or_404(Group, group=self.kwargs['groupname'])
        # Redirect to vlan list
        return '/ipmgmt/%s/vlans/' % self.group
0

1 Antworten

Sie können die Methode get_form_kwargs in Ihrer Sicht implementieren, zum Beispiel:

class YourView(FormView):
    #[...]
    def get_form_kwargs(self):
        kwargs = super(YourView, self).get_form_kwargs()
        kwargs['instance'] = Vlan.objects.get(pk=1)
        return kwargs

Oder Sie können eine UpdateView verwenden und get_object implementieren ...

Edit: I think I misread your question, as you want to pre-fill the form; so passing instance= would not do what you want, as it would also save to that object. For using another object as a template, you could implement the get_initial method and return the fields of your object as a dict

0
hinzugefügt