2015-07-01 5 views
-1

У меня есть следующий views.py:Джанго экземпляра формы представления класса

def address_save(request, cid=0, id=0): 
    context = {} 
    address = None 
    try: 
     if cid >= 1: 
      client = Client.objects.get(pk=cid) 
    except Client.DoesNotExist: 
     return redirect('clients_list') 

    try: 
     if id >= 1: 
      address = Address.objects.get(pk=id) 
    except Address.DoesNotExist: 
     pass 

    address_form = AddressForm(request.POST or None, instance=address, initial={'client': client.id}) 

    if request.POST: 
     if address_form.is_valid(): 
      address_form.save() 
      return redirect('/business/clients/%d' % cid) 

    context.update({ 
     'address_form': address_form, 
    }) 
    return render(request, 'address/add.html', context) 

И моя форма выглядит следующим образом:

class AddressForm(forms.ModelForm): 

    client = forms.CharField(widget=forms.HiddenInput) 

    class Meta: 
     model = Address 
     fields = [ 
      'type', 
      'address_line1', 
      'address_line2', 
      'address_line3', 
      'city', 
      'postcode', 
      'county', 
      'country', 
      'client' 
     ] 

Моя ошибка Traceback выглядит следующим образом:

Environment: 


Request Method: POST 
Request URL: http://cic.js.dev/business/address/save/client/2 

Django Version: 1.8.1 
Python Version: 2.7.8 
Installed Applications: 
('django_admin_bootstrapped', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'bootstrap3_datetime', 
'business', 
'bootstrapform', 
'debug_toolbar') 
Installed Middleware: 
('debug_toolbar.middleware.DebugToolbarMiddleware', 
'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') 


Traceback: 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/var/www/vhosts/cic/cic/business/views.py" in address_save 
    144.   if address_form.is_valid(): 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/forms/forms.py" in is_valid 
    184.   return self.is_bound and not self.errors 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/forms/forms.py" in errors 
    176.    self.full_clean() 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/forms/forms.py" in full_clean 
    394.   self._post_clean() 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/forms/models.py" in _post_clean 
    427.   self.instance = construct_instance(self, self.instance, opts.fields, construct_instance_exclude) 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/forms/models.py" in construct_instance 
    62.    f.save_form_data(instance, cleaned_data[f.name]) 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/db/models/fields/__init__.py" in save_form_data 
    874.   setattr(instance, self.name, data) 
File "/home/bs/envs/cic/lib/python2.7/site-packages/django/db/models/fields/related.py" in __set__ 
    627.      self.field.rel.to._meta.object_name, 

Exception Type: ValueError at /business/address/save/client/2 
Exception Value: Cannot assign "u'2'": "Address.client" must be a "Client" instance. 

Для меня вопрос в том, как я могу иметь HIDDENField для моего внешнего ключа клиента (который уже работает) и создать модель для is_valid метод?

+0

возможно дубликат [Джанго ModelForm, чтобы иметь скрытый вход] (http://stackoverflow.com/questions/15795869/django-modelform- to-have-a-hidden-input) – NightShadeQueen

+0

Насколько я понимаю, вы пытаетесь сделать «клиент» скрытым полем на вашем образце? Если это так, это может помочь: http://stackoverflow.com/questions/15795869/django-modelform-to-have-a-hidden-input – NightShadeQueen

ответ

0

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

Вместо этого просто установить идентификатор клиента при сохранении:

if address_form.is_valid(): 
    address = address_form.save(commit=False) 
    address.client_id = cid 
    address.save() 
Смежные вопросы