Django以表单访问外键字段

时间:2018-11-07 15:15:18

标签: python django

我正在开发一个虚拟图书馆应用程序(使用Django v2.1,python v3.5),任何人都应该能够通过简单地留下一些个人信息(例如姓名,姓氏,电子邮件)来访问图书目录并申请贷款。等

这些是 models.py 中的一些模型:

class Profile(models.Model):
    name = models.CharField(max_length=50)
    # more fields like surname, email, phone...

class TrackBook(models.Model):
    # Somefields to keep track of date and status...
    borrower = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True, blank=True)

class Book(TrackBook):
    #info about title, author, etc.

我要执行的操作是使用在表单中创建的Profile实例更新Book实例的借款人

1)我曾尝试直接访问BookForm中的借款人字段,但这没有用。

# views.py
class BookRequestView(UpdateView):
    template_name = 'core/book_request.html'
    model = Book
    form_class = BookProfileForm

#forms.py
class BookProfileForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['borrower']

# book_request.html
<form class="" action="" method="post">
  {% csrf_token %}
  <div class="row">
    {{ form.borrower.name }}
    <! -- and all other fields -->
  </div>
    {% for field in form.hidden_fields %}
      {{ field }}
    {% endfor %}
  <button type="submit" class="btn btn-block btn-success btn-flat">Save</button>
 </form>

2)我尝试创建Profile模型的inlineformset_factory(),但是它不起作用,因为我想要实现的是在书籍表单中创建概要文件表单,反之亦然。因此,示例here并不是我想要的。

也许我很想做一件简单的事情,但似乎找不到任何兼容的解决方案...欢迎任何帮助/建议。预先感谢。

1 个答案:

答案 0 :(得分:1)

您需要基于个人资料而不是图书的表格。然后,您的视图需要创建配置文件,然后将图书的借阅者设置为该配置文件。

class BookProfileForm(forms.ModelForm):
    book = forms.ModelChoiceField(queryset=Book.objects.all())
    class Meta:
        model = Profile
        fields = ['name', 'address',...]

class BookRequestView(CreateView):
    template_name = 'core/book_request.html'
    model = Book
    form_class = BookProfileForm

    def form_valid(self, form):
        borrower = form.save()
        book = Book.objects.get(self.kwargs['book_id']  # or whatever is in your URL
        book.borrower = borrower
        book.save()
        return redirect(self.get_success_url())