【问题标题】:Specifying both 'fields' and 'form_class' is not permitted不允许同时指定 'fields' 和 'form_class'
【发布时间】:2016-07-11 15:56:45
【问题描述】:

我有以下表单,我想用 Django 脆表单来渲染它。

这是我的观点.py

class RehabilitationSessionCreate(CreateView):
    model = RehabilitationSession
    form_class = RehabilitationSessionForm()

    success_url = reverse_lazy('rehabilitationsessions:list')

    fields = ['patient','medical','therapist','status','date_session_begin','upper_extremity',
              'pain_extremity','affected_segment','movement','metrics','time_movement','games',
              'game_levels','iterations','errors_numbers_game','time_level_acomplished',
              'patient_behavior','observations','date_session_end','period',]

class RehabilitationSessionUpdate(UpdateView):
    model = RehabilitationSession
    success_url = reverse_lazy('rehabilitationsessions:list')
    fields = ['patient', 'medical', 'therapist', 'status', 'date_session_begin', 'upper_extremity',
              'pain_extremity', 'affected_segment', 'movement', 'metrics', 'time_movement', 'games',
              'game_levels', 'iterations', 'errors_numbers_game', 'time_level_acomplished',
              'patient_behavior', 'observations', 'date_session_end', 'period', ]

这是我的urls.py 项目主文件:

from django.conf.urls import url, include
urlpatterns = [

    url(r'^sesiones-de-rehabilitacion/', include('medical_encounter_information.urls', namespace='rehabilitationsessions')),
    # Call the medical_encounter_information/urls.py

]

这是我的medical_encounter_information/urls.py

from django.conf.urls import include, url, patterns
from .views import RehabilitationSessionCreate

urlpatterns = [

    url(r'^$', RehabilitationSessionList.as_view(), name='list'),

    url(r'^(?P<pk>\d+)$', RehabilitationSessionDetail.as_view(), name='detail'),

    url(r'^nuevo/', RehabilitationSessionCreate.as_view(), name='new'),

    url(r'^editar/(?P<pk>\d+)$', RehabilitationSessionUpdate.as_view(), name='edit'),

    url(r'^borrar/(?P<pk>\d+)$', RehabilitationSessionDelete.as_view(), name='delete'),

]

在我的forms.py 文件中,我有:

class RehabilitationSessionForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        # user = kwargs.pop('user', None)
        super(RehabilitationSessionForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', u'Save'))

    def save(self, commit=True):
        rehabilitation_session = super(RehabilitationSessionForm, self).save(commit=False)
        patient = self.cleaned_data['patient']

        if commit:
            rehabilitation_session.save()

        return rehabilitation_session

    class Meta:
        model = RehabilitationSession

        widgets = {
            'pain_extremity':forms.RadioSelect,
            'upper_extremity':forms.RadioSelect
        }
        fields = '__all__'

模板medical_encounter_information/templates/medical_encounter_information/rehabilitationsession_form.html是:

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Crear Registro{% endblock %}
{% block content %}

<div>
    {% crispy form %}
    {% csrf_token %}

</div>
{% endblock %}

当我在浏览器中输入 url http://localhost:8000/sesiones-de-rehabilitacion/nuevo/ 时,我得到以下信息:

 File "/home/bgarcial/.virtualenvs/nrhb_dev/lib/python3.5/site-packages/django/views/generic/edit.py", line 138, in get_form_class
    "Specifying both 'fields' and 'form_class' is not permitted."
django.core.exceptions.ImproperlyConfigured: Specifying both 'fields' and 'form_class' is not permitted.
[11/Jul/2016 15:44:29] "GET /sesiones-de-rehabilitacion/nuevo/ HTTP/1.1" 500 100235

但是,当我在浏览器中输入 url http://localhost:8000/sesiones-de-rehabilitacion/editar/1 时,我会看到以下内容:

因为视图sesiones-de-rehabilitacion/editar/1 (RehabilitationSessionUpdate) 被渲染,而视图sesiones-de-rehabilitacion/nuevo/ (RehabilitationSessionCreate) 没有被渲染知道一起使用相同的模板吗?

【问题讨论】:

  • 如果您只是在基于类的创建视图中删除“字段”元属性会发生什么?这应该可以工作并使用表单中的“字段”元属性。
  • 旁注:在RehabilitationSessionCreate 中,您将form_class 设置为表单instance,而不是表单类。应该改为form_class = RehabilitationSessionForm
  • @knbk 这是真的,就像@-raphv 说的那样。感谢一起提供的信息。

标签: python django django-forms django-views


【解决方案1】:

正如错误所说,您不能同时为您的视图设置form_classfields。您可以设置form_class

class RehabilitationSessionCreate(CreateView):
    model = RehabilitationSession
    form_class = RehabilitationSessionForm  # Not you should *not* have ()

    success_url = reverse_lazy('rehabilitationsessions:list')

或者你可以设置fields:

class RehabilitationSessionCreate(CreateView):
    model = RehabilitationSession
    fields = ['patient', ...]

    success_url = reverse_lazy('rehabilitationsessions:list')

您不需要同时设置fieldsform_class,因为您可以在表单本身上设置fields

class RehabilitationSessionForm(forms.ModelForm):
    class Meta:
        fields = ['patient', ... ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-25
    • 2019-11-17
    • 2012-07-01
    • 2018-11-25
    • 2022-06-19
    • 2017-03-19
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多