Wie erfolgt die Zugriffsanforderung in Modelform für das Hinzufügen von request.user als Fremdschlüssel
-
01-10-2019 - |
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'),
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)