Frage

Ich versuche, außer in der Modelform zu überschreiben den aktuellen Benutzer als Eigentümer eines Fahrzeugs hinzuzufügen. Aber ich erhalte ‚NoneType‘ Objekt hat kein Attribut ‚user‘ Was bin ich vergessen?

forms.py:

class VehicleForm(ModelForm):
    class Meta:
        model = Vehicle
        exclude = ('slug', 'owner', )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(VehicleForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        kwargs['commit']=False
        obj = super(VehicleForm, self).save(*args, **kwargs)
        obj.owner = self.request.user
        obj.save()
        return obj

mein Modell:

class VehicleBase(models.Model):

    owner           = models.ForeignKey(User)

    vehicle_type    = models.SmallIntegerField(_('kind'),
                  choices=vehicle_types, default=1,)

    make            = models.CharField(_('make'), max_length=31,
                  help_text=_('Maximum is 31 characters.'), )

    model           = models.CharField(_('model'), max_length=31,
                  help_text=_('Maximum is 31 characters.'), )

    class Meta:
        abstract = True


class Vehicle(VehicleBase):
    name        = models.CharField(_('fun name'), max_length=31,
                  help_text=_('Maximum is 31 characters.'), )

    slug            = models.SlugField(_('slug'), )

    def save(self, *args, **kwargs):
        is_new = self.pk is None
        if is_new:
            self.slug = slugify("%s %s %s" %(self.make, self.model, self.name, ))
        super(Vehicle, self).save(*args, **kwargs) # Call the "real" save() method.

        if is_new:
            Calendar.objects.get_or_create_calendar_for_object(self, name = "%s's schedule" %self.name)

    class Meta:
        unique_together = (("name", "owner", ), )

def __unicode__(self):
    return u'%s: %s\'s %s %s' %(self.name, self.owner, self.make, self.model, )

def __str__(self):
    return self.__unicode__()

def get_absolute_url(self):
    return reverse('vehicle_view', kwargs={'object_id':self.id, 'slug':self.slug, }, )

Ich verwende eine allgemeine Ansicht:

url(r'^create/$',
    'create_update.create_object',
    dict(template_name='vehicles/vehicle_create.html',
         form_class=VehicleForm,
         post_save_redirect="/vehicles/"),
    name='vehicle_create'),
War es hilfreich?

Lösung 2

Ich wollte ein wenig mehr Informationen zu Manoj ist und Daniel Antworten hinzuzufügen. Im Grunde brauchte ich eine benutzerdefinierte Ansicht, um in dem Benutzer weitergeben speichern:

urls.py:

url(r'^create/$',
    'create_vehicle',
    name='vehicle_create'),

views.py:

@login_required
def create_vehicle(request):
    if request.method == 'POST':
        form = VehicleForm(request.POST)
        if form.is_valid():
            vehicle = form.save(commit=False)
            vehicle.owner = request.user
            vehicle.save()
        return HttpResponseRedirect('/vehicles/')
    else:
        form = VehicleForm()
    return render_to_response('vehicles/vehicle_create.html', {'form': form},     context_instance=RequestContext(request))

forms.py:

class VehicleForm(ModelForm):
    class Meta:
        model = Vehicle
        exclude = ('slug', 'owner', )

Andere Tipps

Hier ist eine kürzere Version, wie ich in diesen Tagen die Ansicht schreiben würde, nur für zukünftige Augen. Keine Notwendigkeit für eine __init__ Subklassifizieren und keine Wiederholung der Form Konstruktor:

@login_required
def create_vehicle(request):
    form = forms.VehicleForm(data=request.POST or None)
    if form.is_valid():
        form.instance.owner = request.user
        form.save()
        return redirect('vehicles')
    return render(request, 'vehicles/vehicle_create.html', {'form': form})

Sie zeigen nicht, wie Sie die Form Ihrer Ansicht nach sind instanziieren. Sie müssen sich daran erinnern, um tatsächlich die Anforderung in geben, wenn Sie tun so:

def myview(request):
    form = VehicleForm(instance=whatever, request=request)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top