相关疑难解决方法(0)

为什么Django中的只读表单字段是个坏主意?

我一直在寻找一种创建只读表单字段的方法,我在这个主题上发现的每篇文章都附带一个声明"这是一个坏主意".现在对于单个表单,我可以理解还有其他方法可以解决问题,但在modelformset中使用只读表单字段似乎是一个完全自然的想法.

考虑一个教师成绩簿应用程序,老师希望能够通过一个SUBMIT输入所有学生(注意复数学生)成绩.modelformset可以迭代所有学生成绩,学生姓名是只读的,成绩是可编辑的字段.我喜欢使用modelformset获得的错误检查和错误报告的强大功能和便利性,但是让学生名称在这样的表单中可编辑是疯狂的.

由于专家django的共识是只读表单字段是一个坏主意,我想知道上面的示例学生级示例的标准django最佳实践是什么?

django django-models django-forms

27
推荐指数
2
解决办法
2万
查看次数

Django表单中的只读字段

如何在Django表单中将字段设置为只读?我知道如何禁用一个字段,但这不是我正在寻找的.任何帮助,将不胜感激.

python forms django readonly django-forms

16
推荐指数
3
解决办法
2万
查看次数

Django创建一个只使用小部件读取的表单字段

我的表单字段如下所示:

class FooForm(ModelForm):
    somefield = models.CharField(
        widget=forms.TextInput(attrs={'readonly':'readonly'})
    )

    class Meta:
        model = Foo
Run Code Online (Sandbox Code Playgroud)

使用上面的代码得到如下错误:init()得到一个意外的关键字参数'widget'

我认为这是表单小部件的合法使用?

python forms django widget

15
推荐指数
3
解决办法
3万
查看次数

使文本输入字段看起来处于禁用状态,但只执行readonly

我有一个HTML输入字段,我希望用户能够看到,但不能编辑.如果我将该字段标记为"已禁用",则不会将其与表单的其余部分一起提交.如果我将其标记为"只读",它的行为就像我想要的那样,但仍然看起来已启用(至少在Chrome上).

基本上,我希望输入字段看起来像禁用字段,但表现为只读字段.这可能吗?

谢谢.

编辑:此外,如果我将其标记为"只读",则仍然可以通过双击它并选择以前存在的内容来更改其值.

html forms django

14
推荐指数
2
解决办法
3万
查看次数

Django:Disabled Dropdown不会将信息发送回POST

我在模型中有一个下拉列表,用户不应该更改所选的值.我发现a disabled确实做到了我需要的东西.然而,这有点奇怪:

表单打开(GET)时第一次选择该值,用户无法更改该值.这很棒:

在此输入图像描述

但是一旦出现验证错误unrelated field并且POST将用户返回到同一表单,之前的信息就会丢失.禁用的外键 - 下拉列表不再包含任何值,并且非常恼人.

在此输入图像描述

我做了一些研究并在stackoverflow上找到了一些东西,并且似乎在禁用了foreignkey-dropdown小部件时,根本没有发回任何数据.虽然可以覆盖验证,但不会为下拉字段抛出任何错误,因为这里第三个答案解释了.但是,如果任何其他不相关的字段抛出错误,则数据将丢失,因为禁用的下拉列表从未在第一时间向POST发送任何数据.

这是一个棘手的情况.

有没有办法将视图中的数据传递给request.POST?或者你的建议是什么?我可以使用a readonly而不是也可以使用disabled,但是用户可以更改下拉列表,这也很烦人.

有任何想法吗?非常感谢

编辑:

小修正:数据没有完全丢失.而是将选择错误地设置为初始虚拟值.

    <select id="id_form-0-deal_type" name="form-0-deal_type" disabled="disabled">
      <option selected="selected" value="">---------</option>
      <option value="1">deal 1</option>
      <option value="2">deal 2</option>
    </select>
Run Code Online (Sandbox Code Playgroud)

更新:

弗朗西斯的解决方案看起来非常有前景.所以我尝试了他的第二个建议,并在html中添加了一个隐藏的输入字段,并将正确的值传递给POST.

问题是现在如何进行.我试图像这样在formset的形式的querydict中添加缺少的条目(为了设置正确的下拉值)

formset.forms[0].data['form-0-deal_type'] = formset.forms[0].data['form-0-hiddenfield'] 
Run Code Online (Sandbox Code Playgroud)

但它说 This QueryDict instance is immutable

唯一的另一种方法是使用常规表单集将其设置为Initials.不幸的是我使用的是modelformsets,它不支持现有表单的首字母.

如果没有其他解决方案,我开始将我的modelformset重构为常规formset.仍然愿意接受...

最终更新+解决方案:

无需将modelformset重构为常规fomsets.事实上,我非常不鼓励这样做,因为它带来了其他问题.modelformsets为您处理所有事情并填补缺失的部分.

实际的问题是QueryDict是不可变的,但这可以通过复制它们轻松解决:

formset = deal_formset(request.POST, queryset=formset_query)        
if formset.is_valid():
  pass
else:
  new_post = request.POST.copy()
  deal_types = dict()
  for k,v in new_post.items():
     if …
Run Code Online (Sandbox Code Playgroud)

python django

12
推荐指数
1
解决办法
5341
查看次数

如何在 django 1.9 之后使用 modelform 创建禁用字段

我想在 Django 1.11 上使用 ModelForm 创建禁用字段。

我读过 django 自 1.9 以来已“禁用字段选项”。但是,我无法理解如何使用 ModelForm 定义禁用字段。

你能告诉我如何用 ModelForm 创建禁用字段吗?

这是我的models.py、forms.py 和views.py


class my_model(models.Model)

    name = models.CharField(max_length=10,)
    title = models.CharField(max_length=10,)
    date = models.DateField(default=date.today,)

    def __str__(self):
        return u'%s' % (self.name)

class my_modelform(ModelForm):

    class Meta:
        model = my_model
        fields = ['name', 'title', 'date']
        widgets = {
            'date': DateWidget(usel10n=True, bootstrap_version=3,),
        }
        disabled = [ 'name' ]

class my_UpdateView(UpdateView):
    model = my_model
    form_class = my_modelform
    template_name = "update_form.html"
    success_url = "success.html"    
Run Code Online (Sandbox Code Playgroud)

虽然,我更改了“disabled = {'name' : True} 而不是 [ …

django python-3.x

7
推荐指数
1
解决办法
5319
查看次数

django formset中的只读字段

我正在使用modelformset工厂从模型字段生成formset.在这里,我想只将queryset对象作为readonly和其他(额外的形式)作为非readonly字段

我怎样才能实现这一目标?

  AuthotFormSet = modelformset_factory(Author, extra=2,)
  formset = AuthorFormSet(queryset=Author.objects.all())
Run Code Online (Sandbox Code Playgroud)

在上面的formset中,我希望将所有queryset对象显示为readonly,并将剩余的额外形式显示为非readonly字段.我怎么能做到这一点?

如果我使用,

      for form in formset.forms:
          form.fields['weight'].widget.attrs['readonly'] = True
Run Code Online (Sandbox Code Playgroud)

这会将所有表单(包括额外的)字段转换为readonly,我不想要.而且我还使用jquery插件将表单动态添加到formset

python django django-forms

6
推荐指数
1
解决办法
5292
查看次数

如何在django表单中只读取ChoiceField

class MyForm(forms.Form):
    CHOICES = (('1', 'one',), ('2', 'two',))
    one_or_two = forms.ChoiceField(widget=forms.RadioSelect, initial='1') 

def show(request):   
    form = MyForm()   
    # render form
Run Code Online (Sandbox Code Playgroud)

如何使字段one_or_two只读?

django django-templates django-forms

5
推荐指数
1
解决办法
6538
查看次数

Django 在 CreateView 中禁用/排除字段,但在 UpdateView 中启用/包含它

我想在创建新对象时排除/禁用 Charfield(带有选项和默认值),但是在编辑此对象时,我想启用/包含 Charfield 以便用户更改它。

\n\n

到目前为止,我尝试了在 Stackoverflow 上找到的这个答案,但这对我来说并不是完整的解决方案。Charfield 确实被禁用了,但是当我尝试创建对象时,Django 总是告诉我该字段是必需的(即使它有默认值)。

\n\n

我的代码:

\n\n
class OfferCreateForm(forms.ModelForm):\n    class Meta:\n        model = Offer\n        exclude = [\'date\', \'number\']\n\n    def __init__(self, *args, **kwargs):\n        request = kwargs.pop("request", None)\n        super(OfferCreateForm, self).__init__(*args, **kwargs)\n        instance = getattr(self, \'instance\', None)\n        if instance and instance.pk:\n            self.fields[\'status\'].widget.attrs[\'disabled\'] = False\n        else:\n            self.fields[\'status\'].widget.attrs[\'disabled\'] = True\n\n        self.helper = FormHelper()\n        self.helper.form_tag = False\n        self.helper.help_text_inline = True\n        self.helper.add_layout(Layout(\n            Fieldset(\'Angebot\',\n                     Row(\n                         Div(\n                             Field(\'name\'),\n                             css_class=\'col-sm-12\'\n                         ),\n                         Div(\n                             Field(\'category\'),\n                             css_class=\'col-sm-6\'\n                         ),\n                         Div(\n                             Field(\'status\'),\n                             css_class=\'col-sm-6\'\n                         ),\n                     )),\n            Fieldset(\'Kunde\',\n                    Row(\n …
Run Code Online (Sandbox Code Playgroud)

python django django-forms

5
推荐指数
1
解决办法
1958
查看次数

django中必填的只读字段

我正在写一本测试"成绩簿"应用程序.models.py文件如下所示.

class Student(models.Model):
    name = models.CharField(max_length=50)
    parent = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

class Grade(models.Model):
    studentId = models.ForeignKey(Student)
    finalGrade = models.CharField(max_length=3)
Run Code Online (Sandbox Code Playgroud)

我希望能够在一个模型中改变几个学生的最终成绩,但现在我只是尝试一个学生.我也试图为它创建一个表单,将学生姓名显示为一个无法更改的字段,这里唯一可以更改的是finalGrade.所以我用这个技巧让studentId只读.

class GradeROForm(ModelForm):
    studentId = forms.ModelChoiceField(queryset=Student.objects.all())
    def __init__(self, *args, **kwargs):
        super(GradeROForm,self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['studentId'].widget.attrs['disabled']='disabled'
    def clean_studentId(self):
        instance = getattr(self,'instance',None)
        if instance:
            return instance.studentId
        else:
            return self.cleaned_data.get('studentId',None)
    class Meta:
        model=Grade
Run Code Online (Sandbox Code Playgroud)

以下是我的看法:

def modifyGrade(request,student):
    student = Student.objects.get(name=student)
    mygrade = Grade.objects.get(studentId=student)
    if request.method == "POST":
        myform = GradeROForm(data=request.POST, instance=mygrade)
        if myform.is_valid():
            grade = myform.save() …
Run Code Online (Sandbox Code Playgroud)

django django-models django-forms

3
推荐指数
1
解决办法
1948
查看次数