2016-03-03 2 views
0

я создал две модели статьи и автора, как это:Джанго: Как создать форму с ForeignKey поля (вход в CharField)

model.py

class Article(models.Model): 
    title = models.CharField(max_length=200) 
    content = models.TextField(max_length = 5000) 
    author = models.ForeignKey('Author', on_delete=models.CASCADE) 

class Author(models.Model): 
    author_name = models.CharField(max_length=200) 
    author_intro = models.TextField(max_length = 3000) 

И я пытаюсь создать форма, которая позволяет пользователю вводить информацию о продукте * (включая название, контент, только автор). Так что всякий раз, когда пользователь вводит автора, эти входные данные сохраняются как в author (в модели модели), так и в author_name (в модели автора). Возможно ли это сделать? Я не могу заставить его работать. Вот что я пробовал:

form.py:

class articleForm(forms.ModelForm): 

    author = forms.ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Article 
     fields = ['title']   
     widgets = { 
     'content': forms.Textarea(attrs={'cols': 75, 'rows': 50})} 


class authorForm(forms.ModelForm): 
    class Meta: 
     model = Author 
     fields = ['author_name'] 

views.py:

def compose_article(request): 

    form_article = articleForm(request.POST or None) 
    if form_article.is_valid(): 
     instance = form_article.save(commit=False) 
     instance.save() 

    context = { 
     "ArtileForm":form_article, 
    } 
    return render(request,"Upload.html",context) 

Заранее спасибо!

+0

Вы исследуемую FormSets? – Selcuk

ответ

0

Вам необходимо указать входное имя автора как поле char и обработать вручную получение или создание автора. Вам также необходимо установить unique=True на author_name. Попробуйте форму, как это:

class ArticleForm(forms.ModelForm): 
    author = forms.CharField() 

    class Meta: 
     model = Article 
     fields = ['title', 'author', 'content'] 
     widgets = { 
      'content': forms.Textarea(attrs={'cols': 75, 'rows': 50}), 
     } 

    def save(self, commit=True): 
     author, created = Author.objects.get_or_create(
      author_name=self.cleaned_data['author'], 
      defaults={'author_intro': ''} 
     ) 
     self.cleaned_data['author'] = author.id 
     return super(ArticleForm, self).save(commit) 

и вид, как это:

from django.views.generic.edit import CreateView 

class ArticleFormView(CreateView): 
    form_class = ArticleForm 
    template_name = 'Upload.html' 

    # You can skip this method if you change "ArtileForm" to "form" 
    # in your template. 
    def get_context_data(self, **kwargs): 
     cd = super(ArticleFormView, self).get_context_data(**kwargs) 
     cd['ArtileForm'] = cd['form'] 
     return cd 
compose_article = ArticleFormView.as_view() 
Смежные вопросы