Перейти к содержимому


Ads
Фотография
- - - - -

селект в django

python python3 django

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 Sergey Kalinin

Sergey Kalinin

    Ампиратор

  • Забанен
  • 3 429 сообщений

Отправлено 19.09.2014, 21:59

в общем понимаю, что питонщиков нема, но тут логика простейшая, может кто и поможет. тем более на стековерфлоу молчат и писать больше некуда

 

форма изменения информации в профиле пользователя реализована следующим образом:
 
models.py:
class Gender(models.Model):     
    gender = models.CharField(
        max_length=10, 
        blank=True,
    )   
        
    @classmethod
    def get_gender_list(self):
        gender_list = list()
        gender_list.append(('', 'Не указан'))
        
        for values_ins in self.objects.all().values_list('id', 'gender'):
            gender_list.append(values_ins)
            
        return gender_list  




class UserProfile(User):            
    gender = models.ForeignKey(
        Gender,
        verbose_name='Пол',
        blank=True,
        null=True,
    )
    phone = models.CharField(
        max_length=50, 
        blank=False,
    )
    
    objects = UserManager()

forms.py:

    class ProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)          
        if self.instance.gender:
            self.fields["gender"].initial = self.instance.gender.id 


    gender = forms.ChoiceField(
        widget=forms.Select, 
        choices=Gender.get_gender_list(),
        label='Пол',
        required=False,
    )       
    phone = forms.CharField(
        label='Номер телефона',
        widget=forms.TextInput(),   
        required=False,     
    )


    class Meta:
        model = UserProfile
        fields = (  
            'gender',    
            'phone',     
        )

 

 
 
после того как пользователь загружает в браузер форму, вводит данные в поля и отправляет, срабатывает аякс-запрос и данные переправляются в представление:
@login_required
def change_profile(request):
    entry_user_profile = UserProfile.objects.get(user_ptr_id=request.user.id)       
    form = ProfileForm(instance=entry_user_profile)
    
    if request.method == "POST" and request.is_ajax():  
        form = ProfileForm(data=request.POST, instance=entry_user_profile)
        if form.is_valid():
            form.save()


            return HttpResponse({'message':'qwerty'})   
            #return HttpResponse(json.dumps({'message':'qwerty'}))  
        
    t = loader.get_template('page_change_profile.html')
    c = RequestContext(request, {
        'form': form, 
    }, [custom_proc])   


    return HttpResponse(t.render(c))    
в результате дебаггер браузера выводит ошибку:
POST http://localhost:8000/change_profile/ 500 (INTERNAL SERVER ERROR) jquery.min.js:4
send jquery.min.js:4
m.extend.ajax jquery.min.js:4
(anonymous function) helper.js:16
m.event.dispatch jquery.min.js:3
r.handle
вот более подробная информация об ошибке:
Remote Address:127.0.0.1:8000
Request URL:http://localhost:8000/change_profile/
Request Method:POST
Status Code:500 INTERNAL SERVER ERROR


ValueError at /change_profile/Cannot assign "''": "UserProfile.gender" must be a "Gender" instance.Request Method: POSTRequest URL: http://localhost:8000/change_profile/Django Version: 1.6.5Python


ValueError at /change_profile/
Cannot assign "''": "UserProfile.gender" must be a "Gender" instance.


Request Method: POST
Request URL: http://localhost:8000/change_profile/
Django Version: 1.6.5
Python Executable: /home/kalinins/.virtualenvs/zapsum/bin/python
Python Version: 3.4.0
 
 
вот js:
$(".profile_form .btn_submit").click(function(event){
	console.log('click');

	var	phone = $('#id_phone').val();

	event.preventDefault();

	console.log(phone);


	$.ajax({
		url: "/change_profile/",
		type: 'POST',
		dataType:"html",
		data: {
			"gender": 1,	// debug value
			"phone": phone,
			"csrfmiddlewaretoken": $('#profile_form input[name=csrfmiddlewaretoken]').val()
		},
		error: function() {
			//alert('Ошибка получения запроса');
		},
		success: function(data) {

			//alert('ajax worked::' + '::' + data.message);
			$('#mySmallModalLabel').text('Изменения сохранены');
			$('#infoModal').modal('show');

			setTimeout(function(){
				$('#infoModal').modal('hide');
			}, 2000);
		}
	});		
});
при этом, если я убираю всё, что связано с полем gender, то форма работает нормально(то есть данные после отправки аякс-запроса обновляются в БД)
 
 
при этом на другом сайте использовал такую же схему, но без аякс-запроса(данные отсылались после клика по кнопке submit) и всё работало без проблем
 

проблема в том, что после отправки аякс-запроса не происходит запись значений в БД. помогите пожалуйста исправить


Сообщение отредактировал Sergey Kalinin: 19.09.2014, 22:05

"Людей я люблю, но их надо п****ть"©Александр Баширов

#2 ARMICRON

ARMICRON

    Небожитель

  • Небожитель
  • PipPipPipPipPip
  • 6 618 сообщений

Отправлено 19.09.2014, 22:06

Про https://docs.djangop...fields/#choices знаешь?

#3 a66at

a66at

    Житель

  • Житель
  • 138 сообщений

Отправлено 19.09.2014, 22:31

Питона не знаю, но с точки зрения банальной эрудиции ошибка в том что get_gender_list возвращает строки, а обработчик форм пытается одну из этих строк присвоить переменной которая должна быть объектом типа Gender(models.Model). Поиск показывает что нужно использовать gender = forms.ModelChoiceField(...) вместо gender = forms.ChoiceField(...). Типа как вот здесь в конце написано: http://python.su/for...ge=1#post-33788 .



#4 Sergey Kalinin

Sergey Kalinin

    Ампиратор

  • Забанен
  • 3 429 сообщений

Отправлено 19.09.2014, 23:33

знаю, но такое решение мне не нравится. хочу чтобы были классические 2 таблички, связанные через форейджн кейс. универсально 


Сообщение отредактировал Sergey Kalinin: 19.09.2014, 23:42

"Людей я люблю, но их надо п****ть"©Александр Баширов





Темы с аналогичным тегами python, python3, django

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей