Django ModelMultipleChoiceField дает мне ProgrammingError - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы получить вашу помощь, потому что у меня возникла проблема, которая немного странна для меня.

Я использую Django 1.11.16

У меня есть в моемForms.py файл этого класса:

class PublicationStatForm(forms.Form):
    # publication_list = forms.ModelMultipleChoiceField(queryset=Publication.objects.all().order_by('pub_id'))
    publication_list = forms.ModelMultipleChoiceField(
        queryset=Publication.objects.all().order_by('pub_id'),
        label=_('Publication Choice'),
        widget=ModelSelect2Widget(
            model=Publication,
            search_fields=['pub_id__icontains', 'title__icontains'],
            attrs={'data-placeholder': "Please select publication(s)"}
        )
    )

    def __init__(self, *args, **kwargs):
        super(PublicationStatForm, self).__init__(*args, **kwargs)

Затем в моем файле views.py:

class StatsView(TemplateView):
    """ Create statistics pageview """
    template_name = 'freepub/stats.html'
    form_class = PublicationStatForm

    def get_context_data(self, **kwargs):
        subtitle = _("Statistics")
        context_data = super(StatsView, self).get_context_data(**kwargs)
        context_data['form'] = self.form_class()
        ...
        return context_data

И, наконец, в моем шаблоне у меня просто есть:

<form class="date-form" method="GET">
   <div class="row">
      <div class="col-md-7">
        {{ form.publication_list }}
      </div>
   </div>
   <input id="submit-date-stats" type="submit" class="btn btn-default" name="SearchPublicationPeriod"
               value="{% trans 'Submit' %}"/><br/>
</form>

Я не понимаю, почему, когда у меня есть эта строка в моей форме, она работает:

# publication_list = forms.ModelMultipleChoiceField(queryset=Publication.objects.all().order_by('pub_id'))

Но когда я заменяю эту строку на это:

publication_list = forms.ModelMultipleChoiceField(
    queryset=Publication.objects.all().order_by('pub_id'),
    label=_('Publication Choice'),
    widget=ModelSelect2Widget(
        model=Publication,
        search_fields=['pub_id__icontains', 'title__icontains'],
        attrs={'data-placeholder': "Please select publication(s)"}
    )
)

Я получаюэта проблема:

Exception Type: ProgrammingError at /freepub/stats
Exception Value: relation "select_cache" does not exist
LINE 1: SELECT COUNT(*) FROM "select_cache"
                             ^

У вас есть идеи?

РЕДАКТИРОВАТЬ: Добавить настройки кеша

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    },
    # "default": {
    #     "BACKEND": "django_redis.cache.RedisCache",
    #     "LOCATION": "redis://127.0.0.1:6379/1",
    #     "OPTIONS": {
    #         "CLIENT_CLASS": "django_redis.client.DefaultClient",
    #     }
    # },
    'select': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'select_cache',
        'TIMEOUT': None,
    }
}

# Set the cache backend to select2
SELECT2_CACHE_BACKEND = 'select'

1 Ответ

0 голосов
/ 03 декабря 2018

Проблема с настройками кеша.

Хотя вы настроили серверную часть кэша базы данных, вам нужно запустить python manage.py createcachetable, чтобы фактически создать ее в базе данных, аналогично тому, как вы запускаете migrate для регулярных изменений или дополнений модели, а такжепочему ошибка выглядит аналогично, что поначалу привело меня к пути миграции.

Исключение Django ProgrammingError является расширением базовой ошибки DatabaseError, поэтому оно всегда связано с чем-то неправильным в базе данных.( source )

Это не будет иметь место, если вы используете Redis или другой кеш KV-хранилища, так как он автоматически вставит его.Поскольку кэш базы данных Django использует таблицу в той же базе данных, эту таблицу необходимо создать в соответствии с этим разделом документации .

...