【问题标题】:Django How can I initial the object ID of all objects in queryset in a formset hidden field?Django 如何在表单集隐藏字段中初始化查询集中所有对象的对象 ID?
【发布时间】:2013-07-04 09:15:10
【问题描述】:

我正在尝试创建一个简单的收件箱应用程序,允许用户使用 UserModel 相互发送消息。

如何在表单集的隐藏字段中填充查询集中所有对象的 ID?因为当我尝试时

File "C:\mysite\pet\views.py" in message
 913.     initial.update({'hidden_field': messages.id})

异常类型:/message/ 处的 AttributeError 异常值:“function”对象没有属性“id”

class Message(models.Model):
    user = models.ForeignKey(User, related_name='sender')
    recipient = models.ForeignKey(User, related_name='recipient')
    created = models.DateTimeField(auto_now_add=True)
    body = models.CharField(max_length=1000)
    read = models.BooleanField(default=False)
    trash = models.BooleanField(default=False)
    sentmessage = models.BooleanField(default=False)
    thread = models.ForeignKey(Thread,blank=True,null=True)
    draft = models.BooleanField(default=False)


    def __unicode__(self):
        return self.body

观看次数

@login_required
def message(request):    
    person = Person.objects.get(user=request.user)
    messages = Message.objects.filter(recipient=request.user.id).order_by("-created").values    
    initial = {}
    initial.update({'hidden_field': messages.id})

    form = formset_factory(CheckBoxForm)
    formset = form(initial=initial)
    return render(request,'messages.html',{'messages':messages,'form':form,'person':person})

表格

class CheckBoxForm(forms.Form):
    checkbox = forms.BooleanField(required=False)
    hidden_field = forms.CharField(widget=forms.HiddenInput())       

模板

     {% for m in messages %}
    {{m.body}}
   {% endfor %}

@新代码

 @login_required
 def message(request):    
     messages = Message.objects.filter(recipient=request.user).order_by("-created")  

     form = CheckBoxForm()
     if request.method =='POST':
         form = ReplyForm(request.POST)
         if form.is_valid():
             id = request.POST.get('hidden_field', False)
             Message.objects.filter(pk=id).delete()
     return render(request,'messages.html',     {'messages':messages,'form':form,'person':person})

【问题讨论】:

  • 只能访问模型类实例中的id。我假设您将复选框放在您的消息旁边,尽管它不在您的代码中。如果是这种情况,为什么不把 放在你的模板中?
  • @lntheNoob 我在上面发布了一些新代码,我做到了。例如,如果我有 5 个复选框。并尝试通过 post 将其删除。它只删除一个
  • @IntheNoob 如果他们有很多消息,那么他们的很多复选框。你将如何创建一个删除对象的函数?

标签: django


【解决方案1】:

说实话,我会用 javascript 来做这件事。也许这不是最好的方式,或者实际上是最好的方式,但它仍然是一种方式。

模板:

<head> 
<script>
checkbox=getelementbyId('#container');
var itemlist= [];
function togglelist(newitem){
    field=getelementbyId('#'+newitem);
if (!field.value){
        itemlist.push(newitem)
}
else{
   itemlist.remove(itemlist.indexOf(newitem))
};
checkbox.innerHTML="<input type='hidden' id='checkbox' label='hidden_field' value='"+String(itemlist)+"'>";

}
</script>
</head>
<body>
<div id="container"> </div>
{% for m in messages %}
<input type="checkbox" id="{{m.id}}" onchange="togglelist({{m.id}})">
{{m.body}}
{% endfor %}

你的models.py你可以去掉布尔值,只有一个字符字段,hidden_​​field。 然后在你的views.py中,使用ast库从字符串中解析列表:

import ast
form = CheckBoxForm()
 if request.method =='POST' and form.is_valid():
         deletelist = request.POST.get('hidden_field', False)
         ids=ast.literal_eval(deletelist)
         for id in ids:
             Message.objects.filter(pk=id).delete()

抱歉,我无法对此进行测试,但希望对您有所帮助。

【讨论】:

  • 感谢您的帮助,我收到此错误 'int' object is not iterable pointing to for id in ids: 。我该怎么办?
  • 当你打印出变量ids时,它显示了什么?如果这个代码的话,应该是一个列表而不是一个 int。 Deletelist 应该是一个看起来像列表的字符串,在 JS 和 python 中表示相同,所以它应该可以工作
  • 您是否将我的代码放入您的模板中?我怀疑不是。 javascript 以 python 可以解释的字符串形式创建一个 id 列表。
  • 我需要有一个js文件吗?
  • 抱歉,我发现我的代码中有一个错误,我已修复。基本上,javascript 会根据复选框中的更改生成一个字符串,并将其发送到“容器”div。它有点令人费解,可能需要一些摆弄。但是,它应该可以工作。
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 2010-09-25
  • 2018-01-03
  • 2021-10-17
  • 2020-10-17
  • 2018-10-05
  • 1970-01-01
  • 2014-02-06
相关资源
最近更新 更多