2016-09-10 2 views
0

У меня есть две модели, у которых есть отношения ManyToMany, Category и Post.Я пытаюсь включить две модели, post_form и category_form в одной и той же форме с помощью одной кнопки отправки. Как показать отношения, когда я его сохраню?Как связать отношения ManyToMany в одной форме с одной отправкой

В настоящее время, когда я добавляю то же имя категории для двух разных сообщений, это дает мне предупреждение о том, что он уже существует. Я хотел бы иметь возможность выбрать одно и то же имя категории в раскрывающемся списке или что-то подобное. Пожалуйста помоги. Если это невозможно, каковы мои альтернативы?

Models.py 
class Category(models.Model): 
    category_name  = models.CharField(max_length=250, unique=True) 
    category_slug  = models.SlugField(max_length=250, unique=True) 

class Post(models.Model): 
    STATUS_CHOICES  = (
         ('draft', 'Draft'), 
         ('published', 'Published'), 
         ) 

    title    = models.CharField(max_length=250) 
    slug    = models.SlugField(max_length=250, 
             unique_for_date='publish') 
    body    = models.TextField() 
    publish    = models.DateTimeField(default=timezone.now) 
    created    = models.DateTimeField(auto_now_add=True) 
    updated    = models.DateTimeField(auto_now=True) 
    status    = models.CharField(max_length=10, 
             choices=STATUS_CHOICES, 
             default='draft') 
    categories   = models.ManyToManyField(Category) 

    def get_absolute_url(self): 
    return reverse('posts:post_detail', 
      args=[self.publish.year, 
       self.publish.strftime('%m'), 
       self.publish.strftime('%d'), 
       self.slug]) 

Views.py 

def post_list(request): 
    queryset = Post.objects.all() 
    return render(request, 'posts/post_list.html', {'post_list': queryset}) 

def post_detail(request, year, month, day, post): 
    instance = get_object_or_404(Post, slug   = post, 
            status   = 'published', 
            publish__year = year, 
            publish__month = month, 
            publish__day = day) 
    return render(request, 'posts/post_detail.html', {'post':instance}) 

def post_create(request): 
    post_form = PostForm(request.POST or None) 
    category_form = CategoryForm(request.POST or None) 

    if post_form.is_valid() and category_form.is_valid(): 
    post_form_instance = post_form.save() 
    category_form_instance = category_form.save() 
    print (request.POST) 
    print (post_form.is_valid) 

    context = {'post_form':post_form, 'category_form':category_form} 
    return render(request, 'posts/post_form.html', context) 

forms.py 
class PostForm(forms.ModelForm): 
    class Meta: 
    model = Post 
    fields = [ 
      'title', 
      'slug', 
      'body', 
      'publish', 
      'status', 
      ] 


class CategoryForm(forms.ModelForm): 
    class Meta: 
    model = Category 
    fields = [ 
      'category_name', 
      'category_slug',     
      ] 
post_form.html 

<!--DOCTYPE html --> 

<html> 
    <head> 
    </head> 


    <body> 
    <form method='POST'>{% csrf_token %} 

    <h1>Form</h1> 


    {{ post_form.as_p }} 
    {{ category_form.as_p }} 

    <input type="submit" value="Create Post" /> 

    </form> 
    </body> 

</html> 

ответ

0

Что именно вы пытаетесь достичь и что именно вы просите. В соответствии с вашим кодом вы создаете записи для категорий и записей сообщений. Вместо этого вы должны делать записи в сообщениях, предоставляя возможность выбирать категории, связанные с ним. Пожалуйста, поймите вашу ситуацию, и ваш текущий код лучше.

Попробуйте это:

forms.py 
class PostForm(forms.ModelForm): 
    class Meta: 
    model = Post 
    fields = [ 
      'title', 
      'slug', 
      'body', 
      'publish', 
      'status', 
      'categories', 
      ] 
views.py 
def post_create(request): 
    post_form = PostForm(request.POST or None) 

    if post_form.is_valid() and category_form.is_valid(): 
    post_form_instance = post_form.save() 
    context = {'post_form':post_form,} 
    return render(request, 'posts/post_form.html', context) 

post_form.html 
<html> 
    <head> 
    </head> 


    <body> 
    <form method='POST'>{% csrf_token %} 

    <h1>Form</h1> 


    {{ post_form.as_p }} 

    <input type="submit" value="Create Post" /> 

    </form> 
    </body> 

</html> 
+0

Спасибо большое. Я точно искал то, что вы просили меня попробовать. Можете ли вы мне помочь и сказать, как я могу добавить новые категории в одну и ту же форму? – user3052646

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