Изменить поле объекта внешнего ключа - PullRequest
1 голос
/ 24 марта 2010

У меня следующая проблема.

У меня есть модель Towar:

class Towar(models.Model):
  nrSeryjny = models.CharField(max_length=100)
  opis = models.CharField(max_length=255)
  naStanie = models.NullBooleanField(null=True)

  def __unicode__(self):
      return "%s" % self.opis

  def lowerName(self):
      return self.__class__.__name__.lower()

  def checkState(self):
      return self.naStanie

  def changeState(self,state):
      self.naStanie=state

  class Meta:
      ordering=['nrSeryjny']
      app_label = 'baza'
      permissions=(("view_towar","mozna miec podglad dla towar"),)

и другая модель, Wypozyczenie, которая связана с Towar отношением внешнего ключа:

class Wypozyczenie(models.Model):
    dataPobrania = models.DateField()
    pracownik = models.ForeignKey(User,null=True)
    kontrahent = models.ForeignKey(Kontrahenci,null=True)
    towar = models.ForeignKey(Towar,null=True)
    objects = WypozyczenieManager()
    default_objects = models.Manager()

    ZwrotyObjects = WypozyczenieZwrotyManager()

    def lowerName(self):
        return self.__class__.__name__.lower()

    def __unicode__(self):
        if self.towar == None:
            return "Dla:%s -- Kto:%s -- Kiedy:%s -- Co:%s" % (self.kontrahent,self.pracownik,self.dataPobrania,"Brak")
        else:
            return "Dla:%s -- Kto:%s -- Kiedy:%s -- Co:%s" % (self.kontrahent,self.pracownik,self.dataPobrania,self.towar)

    class Meta:
        ordering = ['dataPobrania']
        app_label = 'baza'
        permissions = (("view_wypozyczenie","mozna miec podglad dla wypozyczenie"),)

и вид для добавления моделей:

def modelAdd(request,model,modelForm):
    mod = model()
    if request.user.has_perm('baza.add_%s' % mod.lowerName()):
        if request.method == 'POST':
            form=modelForm(request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/'+ mod.lowerName() + '/')
        else:
            form = modelForm()
            v = RequestContext(request,{'form':form})
            return render_to_response('add_form.html',v)

Я хочу, чтобы при добавлении Wypozyczenie и его сохранении Towar, сохраненный Wypozyczenie, изменял свое поле naStanie с True на False.

Greets

Ответы [ 3 ]

0 голосов
/ 24 марта 2010

Если вы хотите всегда синхронизировать эти два параметра, вы можете переопределить метод save () Wypozyczenie.

class Wypozyczenie(models.Model):
    ...

    def save(self):
        self.towar.naStanie = False
        self.towar.save()

Кроме того, вы также можете переопределить метод save () ModelForm.

0 голосов
/ 27 февраля 2017

Вы можете использовать сигналы, излучаемые при сохранении объекта Wypozyczenie . Это может быть немного «чище», чем переопределение save(), особенно когда полезно повторно использовать функцию для других моделей:

@receiver(models.signals.post_save, sender=Wypozyczenie)
def after_wypozyczenie_save(sender, instance, created, **kwargs):
    # `instance` is your saved Wypozyczenie object, you can
    # access all it's fields here:
    instance.towar.naStanie = False
    instance.towar.save()

    # It's also possible to do different action on the first save
    # and on subsequent updates:
    #
    # if created:
    #     ...
    # else:
    #     ...

Перед сохранением или удалением отправляются другие сигналы . Документация Django по сигналам очень полезна здесь.

0 голосов
/ 24 марта 2010

Что вы пробовали?

Не могли бы вы просто поставить

myinstance = form.save()
towar = myinstance.towar
towar.naStanie = False
toware.save()

вместо вашего простого вызова form.save() на ваш взгляд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...