2015-08-13 2 views
1

У меня есть форма, которая работает прекрасно
models.py:2 поля из разных моделей в форме

class Location(models.Model): 
    title = models.CharField(max_length=300) 
    description = models.TextField(null=True, blank=True) 
    address = models.TextField(null=True, blank=True) 

class Review (models.Model): 
    location = models.ForeignKey(Location) 
    description = models.TextField(null=True, blank=True) 

views.py:

class Create(CreateView): 
    model = coremodels.Review 
    template_name = 'location/test.html' 
    fields = '__all__' 
    def form_valid(self, form): 
    form.save() 
    return HttpResponseRedirect('') 

    return super(Create, self).form_valid(form) 

HTML:

<form action="" method="post">{% csrf_token %} 
    {{ form}} 
    <input type="submit" value="Create" /> 
</form> 

Когда я открываю сайт, я могу выбрать местоположение и дать обзор по кнопке создания. Однако теперь я зависим от предварительно заполненных значений в классе Location. Что делать, если я хочу, чтобы пользователь мог непосредственно создать описание, а также название местоположения (я не хочу, чтобы заголовок был в class Review). Я уже пробовал искать это в документах, но ничего не мог найти. Где-то я читал, что могу создать две разные формы, которые обрабатывают разные вещи, но я не уверен, как объединить все это в class Create. Есть ли что-то вроде model = coremodels.Review & coremodels.Location, а затем в HTML я мог сделать

{{form.title}} 
{{form.description}} 

Любой любые идеи или условия поиска я мог бы искать?

Спасибо!

EDIT Ok благодаря Ruddra и this post, вот рабочий раствор. Я должен был изменить это немного для того, чтобы он работал на меня,

class SomeForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     self.fields['title'] = forms.CharField(label='Title', required = False) 
     self.fields['description'] = forms.CharField(label='Description', required = False) 
     self.fields['location'] = forms.ModelChoiceField(queryset= Location.objects.all(), required = False) # This line is for making location not required in form field for input 

    class Meta: 
     model = Review 
     fields = '__all__' 


    def save(self, commit=True): 
     """ 
     It will save location from choice field or inputs of title and description 
     """ 
     instance = super(SomeForm, self).save(commit=False) 
     if instance.location_id: 
      instance.save() 
     else: 
      new_location = Location.objects.create(title=self.cleaned_data['title']) 
      instance.location = new_location 
      instance.save() 
     return instance 

и views.py

class Create(CreateView): 
    model = coremodels.Review 
    template_name = 'location/test.html' 
    form_class = SomeForm 
+1

Might Полезно: http://stackoverflow.com/questions/2770810/multiple-models-in-a-single-django-modelform –

ответ

1

К сожалению, вы не можете использовать две модели, как это, вы должны написать форму и делать вещи там. Например:

class SomeForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['title'] = forms.CharField(label='Title', required = False) 
     self.fields['description'] = forms.CharField(label='Description', required = False) 
     self.fields['location'] = forms.ModelChoiceField(queryset= Location.objects.all(), required = False) # This line is for making location not required in form field for input 

    class Meta: 
     model = Review 
     fields = '__all__' 


    def save(self, commit=True): 
     """ 
     It will save location from choice field or inputs of title and description 
     """ 
     instance = super().save(commit=False) 
     if instance.location: 
      instance.save() 
     else: 
      new_location = Location.objects.create(title=self.cleaned_data['title'], description = self.cleaned_data['description']]) 
      instance.location = new_location 
      instance.save() 
     return instance 

Используйте его в виде:

class Create(CreateView): 
    model = coremodels.Review 
    template_name = 'location/test.html' 
    form = SomeForm 

И вы должны убедиться, что расположение обнуляемое или не требуется в форме (я добавил, что к примеру)

+0

ok, поэтому это дает мне форму, в которой вы можете выбрать заголовок из местоположения, а затем добавить но это не позволяет мне добавить новый заголовок местоположения. О, а также, требуется размещение в этом месте, поэтому, даже если я оставлю его пустым, он не отправит форму. – Tom

+0

Требуется место для размещения, которое не позволит вам установить пустое место, поэтому вам не нужно устанавливать его. И я написал код, подобный этому, либо пользователь может выбрать местоположение, либо заполнить заголовок и описание, которое будет рассматриваться как новое местоположение. Если у меня есть неправильная концепция, plz исправьте меня – ruddra

+0

нет, нет, код работает, однако у меня нет возможности заполнить новый заголовок. Это именно то, что я хочу, что пользователь сам заполняет заголовок и описание и не выбирает. Так что прямо сейчас у меня нет поля ввода для добавления нового места. – Tom

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