Проблема с CheckboxSelectMultiple и ManyToManyField с моделью формы - PullRequest
2 голосов
/ 18 июня 2011

Я совсем новичок в Django (на самом деле 4 месяца), я борюсь с этой проблемой в течение последних 2 дней, я думаю, что делаю какую-то глупую ошибку.Любая помощь или вклад высоко ценится.Я использую Django 1.3.

В модели, которую я имею,

BUSINESS_GROUP = (
    ('MNC','Multinational'),
    ('INT','International (Export/Import)'),
    ('DOM','Domestic/National'),
    ('LOC','Local'),
    ('VIR','Virtual'),
)

class BusinessGroup(models.Model):
    bgroup_type = models.CharField(max_length=15, choices = BUSINESS_GROUP, blank = True, null = True)

class Business(models.Model):
    business_group_choices = models.ManyToManyField(BusinessGroup, verbose_name= "Business Group")

В форме у меня есть что-то вроде

def __init__(self, *args, **kwargs):
    super(BusinessForm, self).__init__(*args, **kwargs)
    self.fields['business_group_choices'].widget = forms.CheckboxSelectMultiple(choices=BUSINESS_GROUP)

В представлении,

if request.method == 'POST':
    form = BusinessForm(request.POST, instance = business)
    if form.is_valid():
        new_business = form.save(commit=False)
        new_business.created_by = request.user
        form_values = form.cleaned_data
        new_business.save()
        assign('edit_business', request.user, new_business)
        return HttpResponseRedirect(new_business.get_absolute_url())

Я получаю такие ошибки, как

"DOM" is not a valid value for a primary key.
"INT" is not a valid value for a primary key.

и т. Д.

Я нашел источник ошибки здесь, в модели Django, источник ,

Но не ясно, какинтерпретировать и решить эту проблему.

Редактировать: Я попытался сделать поля пустыми = True и / или пусто = True все равно Я получаю ошибку проверки, почему?

Снекоторые изменения во всей настройке Я получил эту новую ошибку,

Select a valid choice. [u'MNC', u'INT', u'DOM', u'LOC', u'VIR'] is not one of the available choices.

Новая настройка: в модели

class BusinessGroup(models.Model):
        bgroup_type = models.CharField(max_length=15)

class Business(models.Model):
    business_group_choices = models.ManyToManyField(BusinessGroup, verbose_name= "Business Group", choices=BUSINESS_GROUP)

В форме у меня есть что-то вроде,

def __init__(self, *args, **kwargs):
    super(BusinessForm, self).__init__(*args, **kwargs)
    self.fields['business_group_choices'].widget = forms.CheckboxSelectMultiple(choices=BUSINESS_GROUP)

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Я бы изменил пару вещей ...

Во-первых, я стараюсь избегать "волшебных струн" везде, где могу. Вместо:

BUSINESS_GROUP = (
    ('MNC','Multinational'),
    ('INT','International (Export/Import)'),
    ('DOM','Domestic/National'),
    ('LOC','Local'),
    ('VIR','Virtual'),
)

Я бы сделал:

#in my_app > constants.py
MNC = 0
INT = 1
DOM = 2
LOC = 3
VIR = 4

BUSINESS_GROUP_CHOICES = (
    (MNC, 'Multinational'),
    (INT, 'International (Export/Import)'),
    (DOM, 'Domestic/National'),
    (LOC, 'Local'),
    (VIR, 'Virtual'),
)

Это требует изменения в вашей модели, и я изменил имена полей, чтобы они были немного понятнее:

from django.db import models

from businesses.constants import BUSINESS_GROUP_CHOICES, MNC


class BusinessGroup(models.Model):
    business_group_type = models.IntegerField(choices=BUSINESS_GROUP_CHOICES,
        default=MNC)

    def __unicode__(self):
        choices_dict = dict(BUSINESS_GROUP_CHOICES)
        return choices_dict[self.business_group_type]


class Business(models.Model):
    business_groups = models.ManyToManyField(BusinessGroup)

Настоящая проблема в вашей форме. Вместо того, чтобы просто переопределять виджет, вам нужно использовать ModelMultipleChoiceField, например:

from django import forms

from businesses.models import BusinessGroup


class BusinessForm(forms.ModelForm):
    class Meta:
        model = Business

    business_group = forms.ModelMultipleChoiceField(queryset=BusinessGroup.objects.all(),
                                                    widget=forms.CheckboxSelectMultiple())

Вот почему вы получили ошибку первичного ключа. Ваш BUSINESS_GROUP - это просто кортеж. Django пытался присвоить значение из кортежа из вашего выбора в качестве первичного ключа, что, очевидно, он не может сделать. Вместо этого то, что будет делать ModelMultipleChoiceField, это связать экземпляр выбранной вами бизнес-группы с вашим бизнесом.

Надеюсь, это поможет вам.

0 голосов
/ 19 июня 2011

Хорошо, я понял все правильно, во-первых, никогда не смешивайте ManyToMany и выбор, поэтому моя вторая попытка была совершенно неверной.Проблема была в форме,

Так что теперь окончательное решение выглядит так:

BUSINESS_GROUP = (
    ('MNC','Multinational'),
    ('INT','International (Export/Import)'),
    ('DOM','Domestic/National'),
    ('LOC','Local'),
    ('VIR','Virtual'),
)

class BusinessGroup(models.Model):
    bgroup_type = models.CharField(max_length=15)

class Business(models.Model):
    business_group_choices = models.ManyToManyField(BusinessGroup)

Вместо

class BusinessForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
    super(BusinessForm, self).__init__(*args, **kwargs)
    self.fields['business_group_choices'].widget = forms.CheckboxSelectMultiple(choices=BUSINESS_GROUP)

В форме у меня есть что-то вроде

class BusinessForm(forms.ModelForm):
   business_group_choices = forms.MultipleChoiceField(label="Business Group", widget=forms.CheckboxSelectMultiple, choices=BUSINESS_GROUP)

Вам необходимо использовать MultipleChoiceField с CheckboxSelectMultiple.

Этот элемент в модели полностью неверен (смешивает M2M и варианты),

class Business(models.Model):
    business_group_choices = models.ManyToManyField(BusinessGroup, verbose_name= "Business Group", choices=BUSINESS_GROUP)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...