2016-11-28 51 views
1

如果我使用form.clean()方法處理簡單的formset,並且我使用輸入值從相關模型中提取數據,那麼如何將該數據保存到單獨的模型類中由formset?Django表單 - 有沒有任何方法將數據保存到表單的單獨模型中?

代碼:

#forms.py 
class SlotInlineFormSet(BaseInlineFormSet): 
    def clean(self): 
     super(SlotInlineFormSet, self).clean() 
     y = self.cleaned_data 
     print(y) 

     # Access each form one at a time 
     for idx, form in enumerate(self.forms): 
      form_data = form.cleaned_data 
      print('idx: ' + str(idx+1)) 

      #Pull Necessary Port Variables 
      port_type = (form_data['installed_card'].default_port_type) 
      max_ports = (form_data['installed_card'].max_port_num) 
      port_start_num = (form_data['installed_card'].port_start_num) 
      port_naming = (form_data['installed_card'].port_naming) 

      #Save Ports to Port model 
      #??? 

#views.py 
def manage_slots(request, node_id): 
    node = Node.objects.get(pk=node_id) 
    max_slots = node.chassis.num_slots 
    SlotFormSet = inlineformset_factory(Node, Slot, max_num=max_slots, extra = max_slots-node.slot_set.count(), 
              can_order = False, fields=('installed_card',), can_delete=False, formset = SlotInlineFormSet) 
    if request.method == "POST": 
     formset = SlotFormSet(request.POST, request.FILES, instance=node) 
     if formset.is_valid(): 
      forms = formset.save(commit=False) 
      ### Save form slot number as an enumeration ### 
      formset.save() 
      messages.success(request, "Slot details saved!") 
      return redirect("appDB:apphome") 
    else: 
     formset = SlotFormSet(instance=node) 
    return render(request, 'forms/manage_slots.html', {'formset': formset}) 


#models.py - Port class to save to 

class Port(models.Model): 
    slot = models.ForeignKey(Slot) 
    port_num = models.PositiveSmallIntegerField() 
    port_type = models.ForeignKey(PortDef) 

    class Meta: 
     unique_together = ("slot", "port_num") 

    def __str__(self): 
     if self.slot.sub_slot_num is None: 
      return u'%s - Port: %s%s/%s' % (self.slot.node, self.slot.installed_card.port_naming, self.slot.slot_num, self.port_num) 
     if self.slot.sub_slot_num is not None: 
      return u'%s - Port: %s%s/%s/%s' % (self.slot.node, self.slot.installed_card.port_naming, self.slot.slot_num, self.slot.sub_slot_num, self.port_num) 

    def get_absolute_url(self): 
     return reverse('Port-detail', kwargs={'pk': self.pk}) 

謝謝。

回答

0

您只需要將Port模型導入到forms.py中,並將必要的字段保存到該模型對象中。 像這樣:

#import your Port model from models.py here. 
from .models import Port 

#forms.py 
class SlotInlineFormSet(BaseInlineFormSet): 
def clean(self): 
    super(SlotInlineFormSet, self).clean() 
    y = self.cleaned_data 
    print(y) 

    # Access each form one at a time 
    for idx, form in enumerate(self.forms): 
     form_data = form.cleaned_data 
     print('idx: ' + str(idx+1)) 

     #Pull Necessary Port Variables 
     port_type = (form_data['installed_card'].default_port_type) 
     max_ports = (form_data['installed_card'].max_port_num) 
     port_start_num = (form_data['installed_card'].port_start_num) 
     port_naming = (form_data['installed_card'].port_naming) 
     #import your port model here and get the desired port_object based on data passd by you 

     port_object = Port.objects.get(slot=Your_slot) #Your_slot is the slot passed by you in the cleaned data. 
     port_object.port_type = port_type 
     port_object.port_num = port_start_num 
     port_object.save() 
     #here the data will be saved for that perticular port_object with port_type and port_num fields. 
+0

爲什麼我會用Port.objects.get(插槽= Your_slot)如果該數據不存在了嗎?我會用保存功能 –

+0

@SharadS創建這些數據。 Your_slot變量是爲了您的理解。使用任何條件獲取您想要保存port_type數據的Port記錄。 –

+0

@SharadS。如果要創建新記錄,請使用** create ** Port.objects.create(slot = Your_slot),並將插槽日期或時間放入Your_slot變量中。 –

相關問題