首页 > 解决方案 > 如何在此列表中捕获图书的名称或 reg_no?

问题描述

我正在研究图书馆系统。我无法获得要退回图书馆的一本书/书籍的注册号...我的目的是单击Return哪个捕获书名以进行退回处理..以我所拥有的,当我print(book)返回 None 时没有任何意义已从单击我的模型中获取

class Books(models.Model):
    DEPARTMENT = (
        ('COM', 'Computer'),
        ('ELX', 'Electronics'),
        ('CIV', 'Civil'),
        ('BBS', 'Business'),
        ('MSC', 'Miscellaneous'),
    )
    reg_no = models.CharField(max_length=20, blank=True)
    book_name = models.CharField(max_length=200)
    no_of_books = models.IntegerField()
    book_detail = models.TextField(default='text')
    department = models.CharField(max_length=3, choices=DEPARTMENT)

    def Claimbook(self):
        if self.no_of_books>1:
            self.no_of_books=self.no_of_books-1
            self.save()
        else:
            print("not enough books to Claim")

    def Addbook(self):
        self.no_of_books=self.no_of_books+1
        self.save()


    def __str__(self):
        return self.book_name
class Return(models.Model):
    return_date = models.DateField(default=datetime.date.today)
    borrowed_item = models.ForeignKey(Issue,on_delete=models.CASCADE)
def new_issue(request):
    if request.method == 'POST':
        i_form = IssueForm(request.POST)
        if i_form.is_valid():
            name = i_form.cleaned_data['borrower_id']
            book = i_form.cleaned_data['book_id']
            i_form.save(commit=True)
            books = Books.objects.get(book_name=book)#Get a book names as selected in the dropdown
            semest = Student.objects.get(name=name).semester#Get a student with a semester as selected in the dropdown
            departm = Student.objects.get(name=name).depart
            Books.Claimbook(books)
            return redirect('new_issue')
    else:
        i_form = IssueForm()
    semest = None
    departm = None
    sem_book = Semester.objects.filter(sem=semest, depart=departm)
    return render(request, 'libman/new_issue.html', {'i_form': i_form, 'sem_book': sem_book})

返回视图

def return_book(request):
    book = request.GET.get('book_pk')
    print(book)
    books = Books.objects.get(id=book)
    #b_id = r_form.cleaned_data['borrower_id']
    Books.Addbook(books)
    Issue.objects.filter(borrower_id=1, id=book).delete()
    return render(request,'libman/view_issue.html',{'issue':issue})

显示借阅书籍的模板,每本书旁边都有一个返回链接。

{% if issue %}
  <table class="layout">
    <thead>
      <th>Reg No.</th>
      <th>Student Name</th>
      <th>Book Name</th>
      <th>Issue Date</th>
      <th>Action</th>
    </thead>
  {% for borrow in issue %}
    <tr>
      <td>{{ borrow.borrower_id.student_id }}</td>
      <td>{{ borrow.borrower_id }}</td>
      <td>{{ borrow.book_id }}</td>
      <td>{{ borrow.issue_date }}</td>
      <td name='book_pk'><a href="{% url 'return_book' %}">Return</a> </td>
    </tr>
  {% endfor %}
  </table>
  {% else %}
    <p> There are no books registered. </p>
  {% endif %}

问题模型

class Issue(models.Model):
    borrower_id = models.ForeignKey(Student,on_delete=models.CASCADE)
    book_id = models.ForeignKey(Books,on_delete=models.CASCADE)
    issue_date = models.DateField(default=datetime.date.today)

    def __str__(self):
        return str(self.book_id)

标签: djangodjango-views

解决方案


如果我理解正确 - 我相信您需要将 borrow.book_id 传递给返回视图。所以返回视图知道你想要返回哪本书

在您的模板中添加变量 book_pk 如下

<td name='book_pk'><a href="{% url 'return_book' book_pk = borrow.book_id %}">Return</a> </td>

您还需要更新 urls.py 文件以接受类似这样的新变量

urlpatterns = [
    path('returnbook/<book_pk>/', return_book),
]

但上述内容还需要更新您的视图函数以处理新传递的参数并获取对象等。

def return_book(request,book_pk):

或者

您可以添加带有提交按钮的表单

<form action="{% url 'return_book' %}">
  <label for="book_id">Borrowed Book_id</label>
  <input type="text" id="book_id" name="book_pk" value="{{ borrow.book_id }}" disabled><br><br>
  <input type="submit" value="Submit">
</form>

我认为它应该适用于您当前的代码


推荐阅读