Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Django-更新模型表单的某些字段_Django_Django Forms - Fatal编程技术网

Django-更新模型表单的某些字段

Django-更新模型表单的某些字段,django,django-forms,Django,Django Forms,型号: 表格: 测试: class SessionForm(forms.ModelForm): class Meta: model = Session exclude = ['tutor'] 尝试仅发布以下两个字段: <form action="fhjsdhkl" method="POST">{{ csrf_token }} <input name="start_time" /> <input name="end_time" />

型号:

表格:

测试:

class SessionForm(forms.ModelForm):
  class Meta:
    model = Session
    exclude = ['tutor']
尝试仅发布以下两个字段:

<form action="fhjsdhkl" method="POST">{{ csrf_token }}
  <input name="start_time" />
  <input name="end_time" />
</form>
无法更改会话,因为数据未验证

表单返回的错误为

状态-此字段为必填字段


我需要更新的字段不是固定的,我希望避免每次发布所有字段。我必须为每个案例制作不同的表格吗?

编辑2:旧答案不相关

if request.method == 'POST':
  form = SessionForm(request.POST)
  if request.POST['id']:
    try:
      s = Session.objects.get(pk=request.POST['id'])
      form.instance = s
    except Session.DoesNotExist:
      pass
  if form.is_valid():
    form.save()
好的,这里发生了很多事情:

一,

这一行应该是这样的:

if request.method == 'POST':
  form = SessionForm(request.POST)
  if request.POST['id']:
    try:
      s = Session.objects.get(pk=request.POST['id'])
      form.instance = s
    except Session.DoesNotExist:
      pass
  if form.is_valid():
    form.save()
二,

您应该向上移动会话对象:

form = SessionForm(request.POST, instance = s)
如果执行下面的try-and-except方法,则只要该对象不存在,就会引发验证错误。扔一个404代替。文档位于上述快捷方式上:如果尚未导入,则需要导入

现在,您可以对其进行估价并保存:

if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
三,

此外,您不应该这样做:if request.POST['id']as字符串永远不会为False,即使是空字符串。例如,在空闲状态下尝试以下操作:

if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
    if form.is_valid():
        form.save()
您将注意到,该值的计算结果始终为False


因此,您所看到的并不是实际创建参考模型。

为什么您需要表单?我举了一个只有一个字段的示例,但实际上我从一个模板中创建了多个字段。您得到了什么验证错误?您确定开始时间和结束时间的格式正确吗?它应该采用相同的格式:2012-04-18 13:00:00如果它不同,比如说,MM-DD-YYYY时间,那么您也会提出验证错误。如果数据库中存在状态,则从该行创建模型时,该状态也将存在。因此,当您执行form=SessionForm(request.POST,instance=ses)时,不会因此而引发验证错误。事实上,如果状态缺失,您应该会收到“这是必填字段”错误。这是数据验证错误。“状态-此字段是必需的”是错误。请看编辑我只在一个字段上给出了一个例子,但我实际上是从一个模板发送了多个(我没有-1)@PierredeLESPINAY我有一个小错误,我已经纠正了。这可能就是我被否定的原因。无论如何,我做了一些编辑。我还更改了我的评论:)@PierredeLESPINAY通常您只需将POST数据用作模型表单的参数,模型表单也将负责验证。您可能希望编辑您的问题以包含此内容。典型的做法是:form=SessionForm(request.POST,instance=ses)。这就是我要做的,但由于我没有发布所有字段,表单没有得到验证,我将更新我的问题。
if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
if request.method == 'POST':
    s = get_object_or_404(Session, pk=request.POST['id'])
    form = SessionForm(request.POST, instance = s)
    if form.is_valid():
        form.save()
>>> '' == True
>>> '' == False

>>> 'a' == True
>>> 'a' == False