Sql 在Django中编辑保存的多个复选框选择

Sql 在Django中编辑保存的多个复选框选择,sql,django,forms,checkbox,Sql,Django,Forms,Checkbox,目前执行保存的最佳方式是什么。当涉及到编辑时,我不会得到保存的响应来填充表单。其他字段(如下拉列表)也可以。为了让这一切顺利进行,我应该做些什么?以下是我的看法: def populateaboutme(request): extractlinkedindata(request) if request.method == "POST": form = AboutMeForm(request.POST) if form.is_valid():

目前执行保存的最佳方式是什么。当涉及到编辑时,我不会得到保存的响应来填充表单。其他字段(如下拉列表)也可以。为了让这一切顺利进行,我应该做些什么?以下是我的看法:

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

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

form = AboutMeForm(initial={'name': aboutme.name})
保存时需要使用的instance=告诉django这不是新对象:

if request.method == 'POST':
    form = AboutMeForm(request.POST, instance=aboutme)
现在,使用实例也可以给出初始值,但只有在使用modelform时,保存部分仍然需要它

编辑

我花了一段时间才注意到这一点,因为我一直在关注表单,但你遇到的问题,本质上,是因为你使用的是CharField,而你应该使用ManyToManyField。我的意思是-如何将四个复选框转换为一个CharField,反之亦然?Django不能只是猜测而已。这毫无意义

如果您以某种方式添加一个方法将其转换为复选框,则可以使用CharField。但这也是一个错误的方法,所以不要。相反,我会给你两个解决方案,你会选择一个你认为合适的

最自然的做法是在这里使用多个字段,然后告诉django表单为其使用复选框字段(默认为multiselect,如果需要,可以使用客户端插件查看)。您的模型将如下所示:

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

class AboutMe(models.Model):
    intents = models.ManyToManyField(Intent)
然后,您只需为RELATIONSHIPINTENT\u选项中的每个值创建四个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更复杂,但这是正确的方法

p、 美国。 要记住的其他python技巧:

  • 不要给你的班级命名为“AboutMe”。这应该是视图,而不是模型。让它成为内置用户的扩展,命名为User或给它一个类似的名字(Profile、Account或sort),这样做(至少对我来说)更有意义
  • 字段名不应该看起来像类名(查看更多约定)。所以这应该是我的目的。然而,这也是一个漫长而令人厌倦的名字。关系与意图或单纯意图要好得多

给我看看models.py和forms.py,我会给出一个我正在尝试的更完整的答案:form=aboutform(initial={'MyRelationshipStatus':aboutme.MyRelationshipStatus},instance=aboutme),但这似乎也不起作用。这是一个格式问题吗?即表中的值不是以读回以填充复选框的格式存储的?您使用的是一个选择字段,它应该是一个选择框。复选框在哪里?如果您自己以某种方式在模板上创建了它们,那么显然不能使用initial={}来填充它们(因为它们不是django表单的一部分),您必须手动完成。但是,您也可以使用Multiple Checkbox小部件(在django文档中查找),然后initial将起作用。非常抱歉,我使用了模式/表单的错误部分来说明问题。我已经更新了问题,以显示多个复选框小部件的使用。“选择”字段确实可以很好地工作……但仍然存在多个字段不能正确返回/存储的问题。更新的答案。希望这能把事情弄清楚一点谢谢-对耽搁表示歉意。对于第一个解决方案,我得到了以下错误:“File”/home/models.py”,第40行,在new.save()中,我想这是save命令的问题。我应该在哪里放置创建保存的代码?我无法验证这个新模型。