【问题标题】:Editing saved Multiple Checkbox selections in Django在 Django 中编辑保存的多个复选框选择
【发布时间】:2013-09-28 09:43:21
【问题描述】:

目前执行保存的最佳方式是什么。在编辑方面,我没有收到保存的回复来填充表单。其他字段(例如下拉菜单)很​​好。为了使这项工作,我应该做些什么?这是我的看法:

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'),
)

【问题讨论】:

  • 给我看看models.py和forms.py,我会给出更完整的答案

标签: sql django forms checkbox


【解决方案1】:

您想使用表单上的初始选项:

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

您正在使用的 instance= 是您在保存时需要使用的东西,以告诉 django 这不是一个新对象:

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

现在使用实例也可以给出初始值,但只有在使用模型表单时,你仍然需要它来保存部分。

编辑

我花了一段时间才注意到它,因为我专注于表单,但您遇到的问题基本上源于您使用 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 中的每个值创建四个 Intent 实例:

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')

那么您甚至不需要小部件,因为复选框是布尔字段的默认设置。完成此操作后,使用form(instance=aboutme)form(initial={'jl': aboutme.jl}) 都可以。我知道这些看起来可能比你的简单 CharField 有点吓人而且更复杂,但这是正确的方法。

附言 要记住的其他 python 提示:

  • 不要将您的班级命名为“AboutMe”。那应该是视图,而不是模型。将其作为内置用户的扩展名更有意义(至少对我而言),将其命名为用户或给它一个类似的合适名称(个人资料或帐户或排序)
  • 字段名称不应看起来像类名称(查看PEP8 了解更多约定)。所以应该是my_relationship_intent。然而,这也是一个漫长而令人厌烦的名字。 relationship_intent 或简单的意图要好得多。

【讨论】:

  • 我正在尝试: form = AboutMeForm(initial={'MyRelationshipStatus': aboutme.MyRelationshipStatus},instance=aboutme) 但这似乎也不起作用。这是一个格式问题 - 即表中的值未以可以读回以填充复选框的格式存储?
  • 您正在使用一个选择字段,它应该是一个选择框。复选框在哪里?如果您以某种方式在模板上自己创建它们,那么您显然不能使用 initial={} 来填充它们(因为它们不是您的 django 表单的一部分),您必须手动完成。但是,您也可以使用 Multiple Checkbox 小部件(在 django 文档中查找它),然后 initial 将起作用
  • 真的很抱歉,我使用了错误的模式/表单部分来说明问题。我已更新问题以显示多个复选框小部件的使用。选择字段确实可以正常工作....但是仍然存在多个字段未正确返回/存储的问题。
  • 你去。更新的答案。希望能把事情搞清楚
  • 谢谢 - 抱歉耽搁了。使用第一个解决方案,我收到以下错误:'File "/home/models.py", line 40, in new.save()' 我猜这取决于保存命令。我应该把创建保存的代码放在哪里最好?我无法验证这个新模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2016-05-20
  • 2012-05-07
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多