2016-07-29 8 views
1

Aufrufen von LocationDescription.l_edit gibt den Fehler "save() hat ein unerwartetes Schlüsselwortargument 'location'" zurück. Der Keyword-Name sieht jedoch zufällig aus und kann zu verschiedenen Zeiten auf verschiedene Felder verweisen. Der Methode l_edit wurde die Funktionalität entzogen, aber der Fehler bleibt bestehen. Kurioserweise funktioniert self.location = kwargs ['location'] gefolgt von self.save() einwandfrei.save() hat ein unerwartetes Schlüsselwortargument erhalten

models.py

class LocationDescription(models.Model): 
    location = models.ForeignKey(Location) 
    description = models.ForeignKey(Localization) 
    YEAR_CHOICES = (
     (LocationDescriptionYear.any.value, 'Any'), 
     (LocationDescriptionYear.winter.value, 'Winter'), 
     (LocationDescriptionYear.spring.value, 'Spring'), 
     (LocationDescriptionYear.summer.value, 'Summer'), 
     (LocationDescriptionYear.autumn.value, 'Autumn'), 
    ) 
    year = models.IntegerField(choices=YEAR_CHOICES, default=0) 
    DAY_CHOICES = (
     (LocationDescriptionDaytime.any.value, 'Any'), 
     (LocationDescriptionDaytime.night.value, 'Night'), 
     (LocationDescriptionDaytime.morning.value, 'Morning'), 
     (LocationDescriptionDaytime.day.value, 'Day'), 
     (LocationDescriptionDaytime.evening.value, 'Evening'), 
    ) 
    day = models.IntegerField(choices=DAY_CHOICES, default=0) 
    weather_type = models.ForeignKey('Weather', blank=True, null=True) 
    order = models.IntegerField(default=0) 
    code_check = models.TextField(blank=True, null=True) 

    @classmethod 
    def l_create(cls, request, **kwargs): 
     l = Localization() 
     l.write(request, kwargs['description']) 
     kwargs['description'] = l 
     item = cls(**kwargs) 
     item.save() 
     return item 

    def l_delete(self): 
     l = self.description 
     self.delete() 
     l.delete() 

    def l_edit(self, **kwargs): 
     super(LocationDescription, self).save(**kwargs) 

    @classmethod 
    def localize(cls, locale, **kwargs): 
     if locale == 'eng': 
      result = cls.objects.filter(**kwargs).annotate(text=F('description__eng')) 
     elif locale == 'rus': 
      result = cls.objects.filter(**kwargs).annotate(text=F('description__rus')) 
     else: 
      raise KeyError 
     for r in result: 
      if r.text is None or r.text == '': 
       setattr(r, 'text', 'Error: localization text missing!') 
     return result 

views.py

  location = Location.objects.get(pk=int(request.POST.get('location', ''))) 
      weather_type = Weather.objects.get(pk=int(request.POST.get('weather_type', ''))) 
      item = LocationDescription.objects.get(pk=int(request.POST.get('id', ''))) 
      item.l_edit(location=location, 
         year=request.POST.get('year', ''), 
        day=request.POST.get('day', ''), 
        weather_type=weather_type, 
        order=request.POST.get('order', ''), 
        code_check=request.POST.get('code_check', ''), 
        ) 
+0

Nun, es ist, weil speichern Feld Argumente tatsächlich nicht übernimmt. Warum machst du es so? –

+0

Weil ich keine Ahnung habe was ich mache :) Ich werde die Beispiele noch einmal lesen müssen, denke ich. –

Antwort

3

save nicht jene benannten Argumente benötigen Sie vorbei. Außerdem, da Sie die Standardmethode save nicht überschreiben, sehe ich keine Notwendigkeit für super.

Sie können einfach die Attribute für diese Instanz des Modells gesetzt und save nennen wie es mit einem Modellobjekt:

def l_edit(self, **kwargs): 
    for k in kwargs: 
     setattr(self, k, kwargs[k]) 
    self.save() 

Auf einer Seite zur Kenntnis, mit update effizienter ist als die aktuelle Ansatz, wenn Sie don Ich brauche den nicht im Speicher.

+0

Danke, Captain. Ich wusste, dass ich eine dumme Frage stellte, aber ich war verzweifelt genug, um die zweite Seite von Google zu erreichen, und ich hatte gerade das Gefühl, dass ich kein Verständnis für etwas sehr Einfaches hatte. –

Verwandte Themen