2013-09-28 125 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