【问题标题】:Django forms - Select a valid choice. That choice is not one of the available choicesDjango 表单 - 选择一个有效的选项。该选择不是可用的选择之一
【发布时间】:2016-05-18 00:03:30
【问题描述】:

在我的表单中,我有选择框,但是在提交后我在这个字段上收到错误:“选择一个有效的选择。那个选择不是可用的选择之一。”我正在使用其他形式的代码,一切正常,但不是这种形式:(

forms.py:

BLANK_CHOICE = (('', '---------'),)

class ClientCreateForm(forms.ModelForm):
    class Meta:
        model = Client
        fields = ('name', 'address', 'zip_code', 'city', 'country', 'forwarding_address',
                  'forwarding_zip_code', 'forwarding_city', 'forwarding_country')

    def __init__(self, *args, **kwargs):
        super(ClientCreateForm, self).__init__(*args, **kwargs)
        self.fields['country'].choices = CountriesShortcut.objects.all().values_list('id', 'name')
        self.fields['forwarding_country'].choices = BLANK_CHOICE + tuple(
            CountriesShortcut.objects.all().values_list('id', 'name'))

Models.py

class CountriesShortcut(models.Model):
    name = models.CharField(max_length=80, unique=True)

    class Meta:
        ordering = ['id']

    def __init__(self):
        self.code


class Client(models.Model):
    id = models.OneToOneField(User, on_delete=models.CASCADE, unique=True, primary_key=True)
    name = models.CharField(max_length=256, unique=True)
    address = models.CharField(max_length=64)
    zip_code = models.CharField(max_length=10, help_text='Zip Code')
    city = models.CharField(max_length=64)
    country = models.ForeignKey(CountriesShortcut, related_name='country', blank=True, null=True)
    forwarding_address = models.CharField(max_length=64, blank=True)
    forwarding_zip_code = models.CharField(max_length=10, blank=True)
    forwarding_city = models.CharField(max_length=64, blank=True)
    forwarding_country = models.ForeignKey(CountriesShortcut, related_name='forwarding_country', blank=True, null=True)

    def __str__(self):
        re = self.name + ' [' + str(self.id) + ']'
        return re

你能给我一些建议吗?

更改为查询集后显示的回溯:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/panel/client/create/

Django Version: 1.8.8
Python Version: 3.5.1
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'core',
 'client',
 'registration',
 'avatar',
 'filer',
 'mptt',
 'easy_thumbnails',
 'reversion')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')

Template error:
In template C:\Users\loc\PycharmProjects\CRM\templates\panel\client\form.html, error at line 131
   __init__() takes 1 positional argument but 3 were given

   121 :                             <div class="col-sm-3">
   122 :                                 {{ form_client.city }}
   123 :                                 {% if form_client.errors.city %}
   124 :                                     <p class="help-block">
   125 :                                         {{ form_client.errors.city }}
   126 :                                         {{ form_client.non_field_errors.city }}
   127 :                                     </p>
   128 :                                 {% endif %}
   129 :                             </div>
   130 :                             <div class="col-sm-3">
   131 :                                  {{ form_client.country }} 
   132 :                                 {% if form_client.errors.country %}
   133 :                                     <p class="help-block">
   134 :                                         {{ form_client.errors.country }}
   135 :                                         {{ form_client.non_field_errors.country }}
   136 :                                     </p>
   137 :                                 {% endif %}
   138 :                             </div>
   139 :                         </div>
   140 :                     </div>
   141 :                 </div>

Traceback:
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "C:\Users\loc\PycharmProjects\CRM\core\views.py" in client_create
  111.         return render(request, 'panel/client/form.html', dict)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\loader.py" in render_to_string
  99.         return template.render(context, request)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\backends\django.py" in render
  74.         return self.template.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in render
  210.                     return self._render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in _render
  202.         return self.nodelist.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in render
  905.                 bit = self.render_node(node, context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in _render
  202.         return self.nodelist.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in render
  905.                 bit = self.render_node(node, context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\base.py" in render
  905.                 bit = self.render_node(node, context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\template\debug.py" in render
  92.             output = force_text(output)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\utils\encoding.py" in force_text
  90.                     s = six.text_type(s)
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\utils\html.py" in <lambda>
  399.         klass.__str__ = lambda self: mark_safe(klass_str(self))
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\forms\forms.py" in __str__
  537.         return self.as_widget()
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\forms\forms.py" in as_widget
  593.         return force_text(widget.render(name, self.value(), attrs=attrs))
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\forms\widgets.py" in render
  513.         options = self.render_options(choices, [value])
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\forms\widgets.py" in render_options
  539.         for option_value, option_label in chain(self.choices, choices):
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\forms\models.py" in __iter__
  1107.             for obj in queryset:
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\db\models\query.py" in iterator
  255.             obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
File "C:\Users\loc\dJangoEnvironment\lib\site-packages\django\db\models\base.py" in from_db
  489.             new = cls(*values)

Exception Type: TypeError at /panel/client/create/
Exception Value: __init__() takes 1 positional argument but 3 were given

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您的字段是外键。默认情况下,django 将表单中字段的所有可用值设置为模型的所有对象。查看您的代码,我认为您可以完全删除 ClientCreateForm __init__

    如果您仍想设置自定义选项,则不应设置choices 属性。你应该使用queryset:

    class ClientCreateForm(forms.ModelForm):
    # your meta goes here
    
        def __init__(self, *args, **kwargs):
            super(ClientCreateForm, self).__init__(*args, **kwargs)
            self.fields['country'].queryset = CountriesShortcut.objects.all()
            self.fields['forwarding_country'].queryset = CountriesShortcut.objects.all()
    

    您的字段被标记为null=True,因此会自动添加空破折号。

    如果您有非关系字段,则应使用choices,例如,设置了选择属性的CharField

    【讨论】:

    • 我收到错误“__init__() 需要 1 个位置参数,但给出了 3 个”
    • 哪个__init__ 给你错误-ClientCreateFormCountriesShortcut?你能在你的问题中添加堆栈跟踪吗?
    • 模板中的ClientCreateForm
    • 看看这行回溯:obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])。我打赌你的model_clsClientShortcut,你应该删除ClientShortcut.__init__,因为它什么都不做,或者将签名更改为def __init__(self, *args, **kwargs) 并添加超级调用,因为如果你不这样做,它将无法正确创建和对象
    • 我不确定 Django 是如何工作的,但可能是因为您的字段是 null=True。如果可能,您应该将其设置为null=False。如果您有充分的理由保留它null=True,您可以这样做:self.fields['country'].empty_label = None,或者您可以将字段设为必填并设置初始值:self.fields['country'].required = Trueself.fields['country'].initial = some_country。如果不设置初始值,Django 会显示空选项,但不允许保存
    猜你喜欢
    • 2018-06-11
    • 2021-04-12
    • 2012-01-22
    • 2018-08-13
    • 2017-12-30
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多