【问题标题】:Associating a model with another model when saving it保存时将模型与另一个模型关联
【发布时间】:2018-06-19 21:19:38
【问题描述】:

我有以下代码。产品是这样的:有一个书单。每本书上都有一个表格。此表单保存帖子并使其与这本特定书籍相关。当您单击图书项目时,您会看到与该图书项目相关的所有帖子列表。到目前为止,书籍列表工作正常,保存帖子数据工作正常,当您单击列表时,它(DetailView)显示帖子列表(而不是书籍描述,通常是使用 DetailView 的方式)正常。不起作用的是将帖子保存为与保存帖子的表单相关的特定书籍。更简单地说,当您保存帖子时,该帖子应该与表单所在的书籍相关。

非常感谢您的帮助。谢谢!

views.py:

class BookList(ListView):
model = Book
template_name='books/books.html'

    class PostForm(ModelForm):
        class Meta:
            model = Post
            # Previously I tried, unsuccessfully, this among others:
            # books = Book.objects.filter(book)
            # posts = Post.objects.filter(the_book=books)
            # model = posts
            fields = ['post']  
            widgets = {
            'post': forms.Textarea()
            }

    def get_context_data(self, **kwargs):
        context = super(BookList, self).get_context_data(**kwargs)
        context['form'] = BookList.PostForm
        return context

    def post(self, request, *args, **kwargs):
        form  = BookList.PostForm(request.POST)
        if form.is_valid():
            form.save()
        return render(request, self.template_name, {'form': form })

class Posts(DetailView):
    model = Book
    template_name='books/post_create.html'
    slug_field = 'id'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        book = self.object
        posts = Post.objects.filter(the_book=book)
        context['posts'] = posts
        return context

models.py:

class Book(models.Model):
    book = models.CharField(max_length=1000, blank=False, null=False, default="1")

    def __str__(self):
        return self.book

class Post(models.Model):
    post = models.CharField(max_length=1000, blank=False, null=False)
    the_book = models.ForeignKey('Book', on_delete=models.CASCADE, default="1")
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.post

books.html:

<ul>
{% for book in object_list %}
<div class='ui card'>
<a class="content" href='{% url 'books:posts' book.id %}'>
  <div class="header">{{ book }}</div>
</a>

<div class="ui bottom attached button">

   <form class='ui form' action='' method='post'> {% csrf_token %}
      {{ form.as_p }} 
      <div class='postbutton'>
      <input class='ui button' type="submit" value="Done" />
      </div>
  </form>

</div>

</div>
{% empty %}
<h5>You don't have any books!</h5>
{% endfor %}

post_create.html(名字后面会改……):

<ul>
{% for post in posts %}
<div class='ui card'>
<a class="content">
  <div class="header">{{ post }}</div>
</a>
</div>
{% empty %}
<h5>You don't have any posts!</h5>
{% endfor %}

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    试试这个:在表单中添加 book_id 隐藏输入:

    <form class='ui form' action='' method='post'> {% csrf_token %}
      {{ form.as_p }} 
      <input type="hidden" name="book_id" value="{{ book.id }}">
      <div class='postbutton'>
      <input class='ui button' type="submit" value="Done" />
      </div>
    

    并在您的 BookList 视图中使用它:

    def post(self, request, *args, **kwargs):
        form  = BookList.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.the_book_id = request.POST['book_id']
            post.save() 
        return render(request, self.template_name, {'form': form })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多