Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ReverseManyTone通过django表单从子对象创建对象_Django_Python 3.x_Foreign Keys_Relationship - Fatal编程技术网

ReverseManyTone通过django表单从子对象创建对象

ReverseManyTone通过django表单从子对象创建对象,django,python-3.x,foreign-keys,relationship,Django,Python 3.x,Foreign Keys,Relationship,使用: Python 3.7.3 django 2.2.5 mysql 5.7.27 我有以下型号: class Item(models.Model): ... class Comments(models.Model): Item = models.ForeignKey('Item', default=None, null=True, on_delete=models.CASCADE) Comment = models.TextField(max_length=512, def

使用:

Python 3.7.3

django 2.2.5

mysql 5.7.27

我有以下型号:

class Item(models.Model):
...

class Comments(models.Model):
    Item = models.ForeignKey('Item', default=None, null=True, on_delete=models.CASCADE)
    Comment = models.TextField(max_length=512, default="", blank=True)
我想在通过django表单创建项目时创建一个Comments对象。我试着做:

class ItemInsertForm(forms.ModelForm):
...

    Comments = forms.CharField(required=False,
                              widget=forms.Textarea(attrs={'placeholder':"Use comments to describe item details \
                                                                         or issues that other users should know",
                                                           'rows':5,
                                                           'cols':50,
                                                           }
                                                    )
                              )

    def clean_Comments(self, *args, **kwargs):
        _comment = self.cleaned_data.get('Comments')
        _comments = Item.comments_set.create(Comment=_comment)
        return _comments
但我得到了以下错误:

“ReverseManyToOneDescriptor”对象没有属性“create”

两个表都为空,因此当前不存在任何项和注释。我想这就是为什么没有“创建”方法可用的原因。有什么方法可以实现我想要的吗


或者是否有其他方法来管理Item对象的注释?我创建了另一个表,以便能够将多个注释关联到同一项并区分它们。Item类中的字符字段将把所有注释连接在一个字符串中。

我发现您的代码有很多问题,但我觉得您是诚实地尝试了一下,所以我会尽力帮助您

首先是models.py文件:

  • 模型名称应为单数,因此使用
    Comment
    ,而不是
    Comment
  • 类成员应为小写,因此
    Item
    Comment
    应更改为
    Item
    Comment
  • Comment.Comment
    仍然不是很有描述性。注释是实际对象,它的内容是注释中的文本,因此
    text
    在这里更合适
  • null=True
    的外键已将默认值设置为无
考虑到这一点并清理models.py:

class Item(models.Model):
...

class Comment(models.Model):
    item = models.ForeignKey(Item, null=True, on_delete=models.CASCADE)
    text = models.TextField(max_length=512, default="", blank=True)

然后,转到您的表单:

  comment = form.save()
  comment.item = item.
  comment.save()
  • 由于它是用于创建
    注释的表单
    ,因此更合适的名称应该是
    CommentForm
  • def clean_Comments(self、*args、**kwargs):
    是为在
    Comments
    字段上执行验证而保留的函数,不用于从表单输入创建对象。为此,您可以使用ModelForm的方法。不过,如果要执行某些自定义逻辑,则只需定义一个save方法
让我们先解决这些问题,然后再讨论您收到的错误消息:

class ItemInsertForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['text']

    text = forms.CharField(required=False,
                              widget=forms.Textarea(attrs={'placeholder':"Write your comment to describe item details \
                                                                         or issues that other users should know",
                                                           'rows':5,
                                                           'cols':50,
                                                           }
                                                    )
                              )
提交此表单时,将创建一个
注释
对象。但是,仍然无法将注释添加到
项目


为此,您需要确保数据库中存在
Item
实例,或者允许用户通过
ItemForm
有多种方法可以做到这一点:

  • modelcooicefield
    添加到CommentForm,这将允许用户从选择列表中选择项目
  • 第三种方法是你在尝试什么,以及为什么会出错。检索项目,然后将表单中保存的注释添加到item.comment\u集中

    大概是这样的:

  • item=item.objects.get(pk=)
    comment=form.save()
    项目注释集添加(注释)
    item.save()
    
    嘿,谢谢你抽出时间回答,你有一些好的观点。ItemInsertForm不是一个用于添加注释的表单,而是一个用于创建项目的表单,但我希望也可以通过它添加注释。实际上,我已经通过视图中的form\u valid方法完成了我想要的,方法是在保存表单之后添加:item.comments\u set.create(Comment=\u Comment),其中_Comment是form.cleaned\u data.get('comments')。
      item = Item.objects.get(pk=<item_id>)
    
      item = Item.objects.create(<item_properties_here>)
    
      comment = form.save()
      comment.item = item.
      comment.save()
    
      item = Item.objects.get(pk=<item_id>)
      comment = form.save()
      item.comments_set.add(comment)
      item.save()