2013-12-07 2 views
1

Итак, у меня есть модель для «Модулей», и эта модель охватывает все поля для 4 различных типов модулей, которые я могу создать из нее.Django manytomany field invalid literal для int() с базой 10: ''

Один из модулей требует ManyToManyField, поэтому я могу хранить последние платежи, а затем зацикливать их в шаблоне.

Вот модель для модулей:

class MarketModules(models.Model): 
    types = (
    ('1', 'Server Status'), 
    ('2', 'Recent Donations'), 
    ('3', 'Donation Goal'), 
    ('4', 'Textbox') 
    ) 

    id = models.AutoField("Module id", primary_key=True, editable=False) 
    owner = models.ForeignKey(User, blank=True, null=True) 
    marketid = models.ForeignKey(Market, blank=True, null=True) 
    type = models.CharField("Module type", choices=types, max_length=100, default=1, blank=True, null=True) 
    order = models.IntegerField("Module order", default=1, blank=True, null=True) 

    title = models.CharField("Module title", max_length=200, default="Module") 
    text = models.CharField("Text", max_length=3000, blank=True, null=True) 

    goal = models.IntegerField("Monthly goal",default=100, blank=True, null=True) 
    goalpercentage = models.IntegerField("Monthly percentage", default=100, blank=True, null=True) 
    goalamount = models.IntegerField("Monthly amount", default=0, blank=True, null=True) 

    maxDisplay = models.IntegerField("Display amount",default=5, blank=True, null=True) 
    recentdonors = models.ManyToManyField(ItemsBought, null=True, blank=True) 

    ip = models.CharField("Server IP", max_length=100, blank=True, null=True) 
    port = models.IntegerField("Server port", max_length=20, default=25565, blank=True, null=True) 
    players = models.IntegerField("Players Online", max_length=20, blank=True, null=True) 
    playerpercentage = models.IntegerField("Player percentage", default=100, blank=True, null=True) 
    maxplayers = models.IntegerField("Max Players", max_length=20, blank=True, null=True) 
    playersnames = models.TextField("Player Names", max_length=5000, blank=True, null=True) 
    online = models.BooleanField("Online", default=0) 
    motd = models.CharField("MOTD", blank=True, null=True, max_length=250) 

    enabled = models.BooleanField(default=True) 
    def __unicode__(self): 
     return'%s' % self.id 

Вот Views.py для редактирования формы:

if request.method == "POST": 
    newmodule = ModuleForm(request.POST, instance=instance) 
    if newmodule.is_valid(): 
     module = newmodule.save() 
     if module.type == '1': 
      query_server(MarketModules.objects.filter(pk=module.id)) 
     elif module.type == '3': 
      CalGoal(MarketModules.objects.filter(pk=module.id), module.goal) 
     elif module.type == '2': 
      RecentDonors(module.id, module.maxDisplay) 
     return redirect("/controlpanel/modules/") 
else: 
    newmodule = ModuleForm(instance=instance) 

и вот forms.py для ModuleForm:

class ModuleForm(forms.ModelForm): 
    text = forms.CharField(required=False, widget=CKEditorWidget(attrs={'class': 'form-control'})) 
    title = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) 
    ip = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) 
    port = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) 
    maxDisplay = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) 
    goal = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) 
    class Meta: 
     model = MarketModules 

    def save(self, commit=True, owner=None, marketid=None, order=None, type=None): 
     modelform = super(ModuleForm, self).save(commit=False) 
     if type: 
      modelform.type = type 
     if order: 
      modelform.order = order 
     if owner: 
      modelform.owner = owner 
     if marketid: 
      modelform.marketid = marketid 
     if commit: 
      modelform.save() 
     return modelform 

Проблема в том, что поле ManytoMany должно принять пробел для проверки и должно быть разрешено иметь значение null ан сохранены я получаю ошибку

invalid literal for int() with base 10: '' 

И если я удалю blank=True и null=True я просто получаю ошибку проверки говоря его требуется, как и ожидалось.

Как сохранить поле ManyToMany равным нулю?

ЗАПРОШЕННЫЙ след вызовов TRACEBACK AS:

Traceback: 
File "C:\Python27\Lib\site-packages\django\core\handlers\base.py" in get_response 
    115.       response = callback(request, *callback_args,  **callback_kwargs) 
File "C:\Users\xXxKillDogxXx\Desktop\MinecraftMarket-Redesign\market\views.py" in EditModule 
    617.    module = newmodule.save() 
File "C:\Users\xXxKillDogxXx\Desktop\MinecraftMarket-Redesign\market\forms.py" in save 
    99.    modelform.save() 
File "C:\Python27\Lib\site-packages\django\db\models\base.py" in save 
    546.      force_update=force_update, update_fields=update_fields) 
File "C:\Python27\Lib\site-packages\django\db\models\base.py" in save_base 
    626.        rows =  manager.using(using).filter(pk=pk_val)._update(values) 
File "C:\Python27\Lib\site-packages\django\db\models\query.py" in _update 
    605.   return query.get_compiler(self.db).execute_sql(None) 
File "C:\Python27\Lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 
    1014.   cursor = super(SQLUpdateCompiler, self).execute_sql(result_type) 
File "C:\Python27\Lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 
    830.    sql, params = self.as_sql() 
File "C:\Python27\Lib\site-packages\django\db\models\sql\compiler.py" in as_sql 
    979.     val = field.get_db_prep_save(val, connection=self.connection) 
File "C:\Python27\Lib\site-packages\django\db\models\fields\__init__.py" in  get_db_prep_save 
    304.          prepared=False) 
File "C:\Python27\Lib\site-packages\django\db\models\fields\__init__.py" in  get_db_prep_value 
    296.    value = self.get_prep_value(value) 
File "C:\Python27\Lib\site-packages\django\db\models\fields\__init__.py" in  get_prep_value 
    991.   return int(value) 

Exception Type: ValueError at /controlpanel/modules/980/1/edit/ 
Exception Value: invalid literal for int() with base 10: '' 
+0

Можете ли вы опубликовать полную информацию о трассировке? – aIKid

+0

Добавил traceback :) –

+0

Уверены ли вы, что проблема с полем M2M? Не могли бы вы предоставить недействительные данные (форму)? – twil

ответ

2

Проблема заключается в том, что ваш ModuleForm объявляет goal быть CharField. Вы говорите Django, что это должна быть строка, поэтому, когда значение не вводится, пустая строка ('') передается на уровень базы данных, который ожидает целое число.

Решение прост: goal = forms.IntegerField(...). Убедитесь, что вы сделали то же самое для других полей (например, port, maxDisplay).

+0

Омг, я так глуп, благодарю вас! –

Смежные вопросы