2013-09-28 43 views
1

執行保存的最佳方式是什麼,因爲此刻。當涉及到編輯時,我沒有得到保存的響應來填充表單。其他領域,如下降很好。爲了實現這個目標,我應該做些什麼?這是我的觀點:在Django中編輯保存的多個複選框選項

def populateaboutme(request): 
    extractlinkedindata(request)  
    if request.method == "POST": 
     form = AboutMeForm(request.POST) 
     if form.is_valid(): 
      today = datetime.date.today() 
      currentYYMMDD = today.strftime('%Y-%m-%d') 
      model_instance = form.save(commit=False) 
      model_instance.save() 
      request.session["AboutMe_id"] = model_instance.pk 
      StoreImage(settings.STATIC_ROOT, str(request.session["fotoloc"]), '.jpg', str(request.session["AboutMe_id"])) 
      return redirect('/dashboard/') 
    else: 
     myid = request.session["AboutMe_id"] 
     if not myid: 
      form = AboutMeForm() 
     else: 
      aboutme = AboutMe.objects.get(pk=int(myid)) 
      form = AboutMeForm(instance=aboutme)    


    return render(request, "aboutme.html", {'form': form}) 

Here are the models: 

    class AboutMe(models.Model): 
     MyRelationshipIntent  = models.CharField(max_length=50) 

和形式:

class AboutMeForm(ModelForm): 
     class Meta:  
      model = AboutMe 
     exclude =() 

     MyRelationshipIntent = forms.MultipleChoiceField(choices=RELATIONSHIPINTENT_CHOICES,widget=forms.CheckboxSelectMultiple()) 

    RELATIONSHIPINTENT_CHOICES = (
    ('JL', 'Just Looking'), 
    ('FL', 'Looking for friendship'), 
    ('FN', 'Looking for fun'), 
    ('FL', 'Looking for a relationship'), 
) 
+0

讓我看看models.py和forms.py,我會給出更完整的答案 – yuvi

+0

完成...更新。 – disruptive

回答

0

您要使用的初始選項的形式:

form = AboutMeForm(initial={'name': aboutme.name}) 

實例=您使用的是你需要使用時保存告訴django這不是一個新的對象:

if request.method == 'POST': 
    form = AboutMeForm(request.POST, instance=aboutme) 

現在使用實例可以也給出初始值,但只有在使用modelform時,仍然需要它用於保存部分。

編輯

我花了一段時間來注意到它,因爲我的工作重點形式,但你所遇到的問題莖,從本質上講,一個事實,即您使用的是CharField,你應該是使用ManyToManyField。我的意思是 - 如何將四個複選框轉換爲一個CharField,反之亦然? Django不能僅僅猜測它。這個不成立。

如果您以某種方式添加方法將其轉換爲複選框,您可以使用CharField。但這也是一種錯誤的做法,所以不要這樣做。相反,我會給你兩個解決方案,你會選擇一個你認爲合適的解決方案。

最自然的事情就是在這裏使用ManyToMany字段,然後告訴Django表單使用複選框字段(默認情況下是多選,如果你想要的話可​​以使用客戶端插件到make thatnice as well)。您的模型將是這個樣子:

class Intent(models.Model): 
    relationship = models.CharField(max_length=50) 

class AboutMe(models.Model): 
    intents = models.ManyToManyField(Intent) 

然後你只需爲每個值四個意向實例在RELATIONSHIPINTENT_CHOICES:

rels = ('Just Looking', 
'Looking for friendship', 
'Looking for fun', 
'Looking for a relationship') 

for i in rels: 
    new = Intent(relationship=i) 
    new.save() 

這就是,如果你認爲你可能想特別好稍後添加更多選項(並且您可以在管理站點上創建模型以緩解該過程,而不是我在此處編寫的腳本)。如果你不喜歡這個解決方案,並且你確定你的選擇將保持不變,另一個可能適合你的優秀解決方案是爲每個選項創建一個布爾字段。像這樣:

class AboutMe(models.Model) 
    jl = models.BooleanField(verbose_name='Just Looking') 
    fl = models.BooleanField(verbose_name='Looking for friendship') 
    fn = models.BooleanField(verbose_name='Looking for fun') 
    fl = models.BooleanField(verbose_name='Looking for a relationship') 

然後你甚至不需要小部件,因爲checkbox是布爾字段的默認值。這樣做後,使用form(instance=aboutme)form(initial={'jl': aboutme.jl})都將工作。我知道這些可能會比簡單的CharField有點恐怖和複雜,但這是正確的選擇。

p.s. 要記住的其他python提示:

  • 不要命名您的類「AboutMe」。這應該是觀點,而不是模型。(對我來說至少)使其成爲內置用戶的擴展,將其命名爲用戶或給它一個類似的配件名稱(配置文件或帳戶或排序)
  • 字段名稱不應該看起來像類名稱(查看PEP8瞭解更多約定)。所以它應該是my_relationship_intent。不過,這也是一個漫長而疲憊的名字。 relationship_intent或簡單的意圖是好得多。
+0

我想:form = AboutMeForm(初始= {'MyRelationshipStatus':aboutme.MyRelationshipStatus},實例= aboutme),但這似乎不工作。這是一個格式問題 - 即表中的值沒有以讀回填充複選框的格式存儲? – disruptive

+0

您正在使用選擇字段,該字段應該是選擇框。複選框在哪裏?如果你以某種方式自己在模板上創建它們,那麼你顯然不能使用initial = {}來填充它們(因爲它們不是你的django表單的一部分),你必須手動完成它。不過,您也可以使用多個複選框小部件(在django文檔中查找它),然後初始將工作 – yuvi

+0

真的很抱歉,我使用模式/表單的錯誤部分來說明問題。我已更新該問題以顯示多個複選框小部件的使用。選擇字段確實工作得很好....但仍然存在多個字段未被正確返回/存儲的問題。 – disruptive