2014-03-06 58 views
1

我有3種型號設置如下:的Django模型實例編輯

#models.py 
class Room(models.Model): 
    room_number = models.CharField(max_length=20, primary_key=True, null=False, blank=False) 
    isolation_status = models.BooleanField() 


class Treatment(models.Model): 
    room_number = models.ForeignKey(Room, primary_key=True) 
    treated = models.BooleanField() 

class Isolation(models.Model): 
    room_number = models.ForeignKey(Room, primary_key=True) 

我需要當我創建一個新的治療目標設定在Room.isolation_status場爲False做什麼。

#views.py 
class AddTxView(FormView): 
    template_name = 'addtx.html' 
    form_class = TxForm 
    success_url = '/rooms/addtx/' 

def update_iso(self, form): 
    instance = Room.objects.get(room_number=room_number) 
    instance.isolation_status = False 

def form_valid(self, form): 
    save_it = form.save(commit=False) 
    save_it.save() 
    return super(AddTxView, self).form_valid(form) 

#forms.py 
class TxForm(forms.ModelForm): 
    class Meta: 
     model = Treatment 

什麼時候應該調用update_iso函數?在save()之後?我應該使用

+0

您*正在使用基於類的視圖。 –

回答

0

你可以在模型中設置此。每當您保存治療時,檢查它是否是新的。如果是,請將room_number的isolation_status設置爲false。

#models.py 
class Room(models.Model): 
    room_number = models.CharField(max_length=20, primary_key=True, null=False, blank=False) 
    isolation_status = models.BooleanField() 


class Treatment(models.Model): 
    room_number = models.ForeignKey(Room, primary_key=True) 
    treated = models.BooleanField() 

    def save(self, *args, **kwargs): 
     is_new = False 
     if self.pk is None: 
      is_new = True 
     super(Treatment,self).save(*args, **kwargs) 
     if is_new: 
      self.room_number.isolation_status = False 
      self.room_number.save() 

class Isolation(models.Model): 
    room_number = models.ForeignKey(Room, primary_key=True) 

通過這樣做,只要您添加治療(無論是在您的意見或在管理員),它將工作。

1

基於類的視圖保存在治療前對象,你可以不喜歡它:

form_obj = form.save(commit=False) 
form_obj.room_number.isolation_status = False 
form_obj.save() 
+0

確實,這是覆蓋'form_valid'並以commit = False調用save的唯一真正原因。我無法想象爲什麼OP已經做到了。 –