Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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
Python Django-禁用对表单集中现有表单的编辑,但允许在新表单中编辑_Python_Django_Forms_Python 3.x - Fatal编程技术网

Python Django-禁用对表单集中现有表单的编辑,但允许在新表单中编辑

Python Django-禁用对表单集中现有表单的编辑,但允许在新表单中编辑,python,django,forms,python-3.x,Python,Django,Forms,Python 3.x,当表单已经存在并且只需要更新两列时,如何使模型表单集中的表单字段处于禁用状态,但当用户向表单集中添加新表单时,如何使这些字段处于可编辑状态 models.py: from django.db import models from django.utils import timezone class MyModel(models.Model): idno = models.CharField(max_length=20) date = models.DateTimeField(d

当表单已经存在并且只需要更新两列时,如何使模型表单集中的表单字段处于禁用状态,但当用户向表单集中添加新表单时,如何使这些字段处于可编辑状态

models.py:

from django.db import models
from django.utils import timezone

class MyModel(models.Model):
    idno = models.CharField(max_length=20)
    date = models.DateTimeField(default=timezone.now)
    entity = models.CharField(max_length=50)
    logic = models.CharField(max_length=100)
    choices = (
        ('1', 'Choice1'),
        ('2', 'Choice2'),
        ('3','Choice3'),
    )
    choices = models.CharField(
        max_length=20,
        choices=choices,
        null=True,
        )
    comment = models.CharField(max_length=500, null=True)
    def __str__(self):
        return self.idno
forms.py:

from .models import MyModel
from django.forms import modelformset_factory, ModelForm

class MyForm(ModelForm):

    class Meta:
        model = MyModel
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['idno'].disabled = True
        self.fields['date'].disabled = True
        self.fields['entity'].disabled = True
        self.fields['logic'].disabled = True

MyFormSet = modelformset_factory(MyModel, extra=1, exclude=(), form=MyForm)
views.py:

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .models import Alert
from .forms import AlertFormSet
from django.contrib import messages

def index(request):
    newAlerts = MyModel.objects.filter(choices__isnull=True)
    modelformset = MyFormSet(request.POST or None, queryset=newAlerts)
    context = {'modelformset':modelformset}
    if request.method == 'POST':
        for form in modelformset:
            if form.is_valid():
                if form.has_changed():
                    form.save()
                    idno = form.cleaned_data['idno']
                    entity = form.cleaned_data['entity']
                    messages.success(request, 'idno %s for %s was saved' % (idno, entity))
        return HttpResponseRedirect('/')
    return render(request, 'selfserve/index.html', context)
index.html:

<form method="post" action="">
  {% csrf_token %}
  {{ modelformset.management_form }}
<div id="form_set">
    {% for form in modelformset %}
        <table class='no_error'>
            {{ form.as_table }}
        </table>
    {% endfor %}
</div>
<input type="button" value="Add More" id="add_more">
<input type="submit" value="Submit">
<div id="empty_form" style="display:none">
    <table class='no_error'>
        {{ modelformset.empty_form.as_table }}
    </table>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    $('#add_more').click(function() {
        var form_idx = $('#id_form-TOTAL_FORMS').val();
        $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
        $('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
    });
</script>
{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
</form>

{%csrf_令牌%}
{{modelformset.management_form}
{modelformset%中表单的%s}
{{form.as_table}}
{%endfor%}
{{modelformset.empty_form.as_table}
$(“#添加更多”)。单击(函数(){
var form_idx=$('#id_form-TOTAL_FORMS').val();
$('#form_set')。追加($('#empty_form').html()。替换(/#u前缀uu/g,form_idx));
$('id_form-TOTAL_FORMS').val(parseInt(form_idx)+1);
});
{%if消息%}
    {消息%中的消息为%s} {{message}} {%endfor%}
{%endif%}
现在,当用户使用“添加更多”按钮添加新表单时,我希望为现有表单禁用的字段也被禁用。我看到了这个问题:。但是,我不明白如何组合解决方案的两个元素:django>1.9中的fields.disabled=True,以及用于在表单集中现有表单和新表单之间划分的if语句。我也听说过
\u construct\u form
方法是一个潜在的选项,但我认为在模型表单创建中使用if语句会更清晰、更容易理解


感谢您提供的所有见解

在我看来,您可以在链接到的问题中使用以下技巧:

class MyForm(ModelForm):

    class Meta:
        model = MyModel
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['idno'].disabled = True
            self.fields['date'].disabled = True
            self.fields['entity'].disabled = True
            self.fields['logic'].disabled = True

请注意,您只能通过检查实例是否存在来执行此操作,因为所有字段都是必需的。如果其中一些变量不是,您需要检查它们是否都有值。

这会导致在赋值之前引用
局部变量“instance”
。我是否需要先在其他地方实例化
实例
?修复了它-
实例
在实例化实例时必须是
实例
。我发誓我以前试过这个解决方案…一定是有两个字符错了。非常感谢。哦,是的,我忘了那行的引号了。现在修复了它,即使你已经让它工作了。