1

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

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

1 回答 1

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 表单为其使用复选框字段(默认为多选,如果您愿意,可以使用客户端插件来实现看起来也不错)。你的模型看起来像这样:

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)andform(initial={'jl': aboutme.jl})都可以。我知道那些看起来可能比你简单的 CharField 有点吓人而且更复杂,但这是正确的方法。

ps 要记住的其他 python 提示:

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