2014-03-06 61 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已经做到了。 –