2010-10-27 3 views
1

У меня есть система, которая полагается на другие модели, но хочу сделать ее немного более открытой, так как иногда мои пользователи требуют немного больше.База данных Django сама узнает

В настоящее время для аргументации у меня есть 2 authors в модели Author.

john, james 

Когда пользователь добавляет книгу, а Author нет, как я могу добавить other поле в форме, что если выбран, то генерирует дополнительное поле, в котором пользователь может ввести имя из Author и обработка формы таким образом, что новый автор добавляется и выбирается при отправке?

MODELS.PY

class Author(models.Model): 
    name = models.CharField(max_length=30) 

FORMS.PY

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 

VIEWS.PY

def new(request, template_name='authors/new.html'): 

if request.method == 'POST': 
    form = AuthorForm(request.POST, request.FILES) 
    if form.is_valid(): 
     newform = form.save(commit=False) 
     newform.user = request.user 
     newform.save() 

     return HttpResponseRedirect('/') 

else: 
    form = AuthorForm() 

context = { 'form':form, } 

return render_to_response(template_name, context, 
    context_instance=RequestContext(request)) 

ответ

1

предполагая вашу книгу модель такова:

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    #etc. 

попробовать что-то вроде этого:

class BookForm(ModelForm): 
    other = forms.CharField(max_length=200, required=False) 

    def clean(self, *args, **kwargs): 
     other = self.cleaned_data.get('other') 
     author = self.cleaned_data.get('author') 
     if author is None or author == '': 
      self.cleaned_data['author'] = Author(name=other).save() 

     return self.cleaned_data 

    class Meta: 
     model = Book 

Если автор будет ManyToManyField:

класс BookForm (ModelForm): другое = forms.CharField (max_length = 200 , required = False)

def clean(self, *args, **kwargs): 
    other = self.cleaned_data.get('other') 
    author = self.cleaned_data.get('author') 
    if other is not None or other != '': 
     for newauthor in other.split(','): #separate new authors by comma. 
      self.cleaned_data['author'].append(Author(name=newauthor).save()) 

    return self.cleaned_data 

class Meta: 
    model = Book 
+0

Большое вам спасибо, я посмотрю и дам вам знать! – ApPeL

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