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),这样做(至少对我来说)更有意义
- 字段名不应该看起来像类名(查看更多约定)。所以这应该是我的目的。然而,这也是一个漫长而令人厌倦的名字。关系与意图或单纯意图要好得多