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

时间:2013-09-28 09:43:21

标签: sql django forms checkbox

目前执行保存的最佳方法是什么。在编辑时,我没有得到保存的回复来填充表单。其他领域如下降都很好。在视图中我是否应该做些什么来使这项工作?以下是我的观点:

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

1 个答案:

答案 0 :(得分:0)

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

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

你正在使用的实例=你需要在保存时使用,告诉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更可怕,更复杂,但这是正确的方法。

P.S。 其他要记住的python技巧:

  • 不要将您的课程命名为“AboutMe”。那应该是观点,而不是模型。更有意义的是(至少对我而言)使其成为内置用户的扩展,将其命名为User或给它一个类似的拟合名称(配置文件或帐户或排序)
  • 字段名称不应该类名称(有关更多约定,请查看PEP8)。所以它应该是my_relationship_intent。然而,这也是一个漫长而疲惫的名字。 relationship_intent或简单的意图是好多了。