Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2016 12:58:27

Denzil
Зарегистрирован: 2015-12-24
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Ругается форма при создании объекта

models.py

 class Location(models.Model):
        name = models.CharField(max_length=100, verbose_name=u"Локация", default=u'')
        country = models.ForeignKey("Country")
    
    class Country(models.Model):
        name = models.CharField(max_length=50, verbose_name=u"Страна")
    
    class Photo(models.Model):
        location = models.ForeignKey(Location, null=True, verbose_name=u'Фото')
        photo = models.ImageField(upload_to='photos', null=True)

forms.py

 class LocationForm(forms.ModelForm):
    
    class Meta:
        model = Location
        fields = ['name', 'country']
    
    
    photos = MultiFileField(min_num=1, max_num=10)
    
    def save(self, commit=True):
        instance = super(LocationForm, self).save(commit)
        for each in self.cleaned_data['photos']:
            Photo.objects.create(photo=each, location=instance)
    
        return instance

views.py

 class AddLocationPageView(CreateView):
        model = Location
        form_class = LocationForm
        template_name = 'add_location.html'
    
    class BrowseLocationsPageView(ListView):
        model = Country
        context_object_name = 'countries'
        template_name = "browse_locations.html"

add_location.html

<form action="" method="POST">{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-default" type="submit">Add</button>
</form>

browse_locations.html

{% for country in countries %}
                {{ country }}
    {% endfor %}
При создании объекта Location поле формы Страна ругается:
“Select a valid choice. That choice is not one of the available choices.”

Разумеется у меня нет никаких чойсов, так как замысел такой, что при отсутствии страны в БД она должна создаваться в момент создания Локации, а при наличии (допустим кто-то уже создал какую-то локацию с такой страной) - привязываться к Локации.

Спасибо!

Офлайн

#2 Июнь 2, 2016 13:25:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ругается форма при создании объекта

А у вас в форме нет никакого поля для создания локации. У вас только селект, как же вы создадите то?
Тут лучше всего действовать аяксом: создаете страну, асинхронно передаете её на сервер и возвращаете json-представление страны, которое всовываете в селект. Это совсем немного кода на jquery.



Офлайн

#3 Июнь 2, 2016 13:39:01

Denzil
Зарегистрирован: 2015-12-24
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Ругается форма при создании объекта

FishHook
А у вас в форме нет никакого поля для создания локации. У вас только селект, как же вы создадите то?Тут лучше всего действовать аяксом: создаете страну, асинхронно передаете её на сервер и возвращаете json-представление страны, которое всовываете в селект. Это совсем немного кода на jquery.
Как это нет поля создания локации? что-то Вы не поняли… моя форма состоит из двух полей - название Локации и Страна… так вот Страна требует чойса.. а мне надо чтобы она не требовала чойса, а создавала Страну с привязкой к Локации или если есть такая страна, то просто привязывала

Офлайн

#4 Июнь 2, 2016 16:27:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ругается форма при создании объекта

Denzil
Как это нет поля создания локации? что-то Вы не поняли… моя форма состоит из двух полей - название Локации и Страна
Форму вы создаете на основании модели, страна в модели - это ссылка на первичный ключ другой модели.
Это будет работать, только если инстанс другой модели уже существует. По этому и селект.
Вам надо сделать вот так

 class LocationForm(forms.ModelForm):
    
    class Meta:
        model = Location
        fields = ['name', 'country']
    
    
    photos = MultiFileField(min_num=1, max_num=10)
    new_country_name = forms.Charfield()    
    def save(self, commit=True):
        instance = super(LocationForm, self).save(commit)
        for each in self.cleaned_data['photos']:
            Photo.objects.create(photo=each, location=instance)
    
        return instance

и где-то обработать вот этот new_country_name

или, как я говорил выше, произвести эту операцию аяксом.



Офлайн

#5 Июнь 2, 2016 16:57:26

Denzil
Зарегистрирован: 2015-12-24
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Ругается форма при создании объекта

Спасибо! до меня дошло я просто надеялся на магию ))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version