Как я могу записать имя или reg_no книги в этом списке?

#django #django-views

Вопрос:

Я работаю над библиотечной системой. Я не могу получить регистрационный номер книги/книг, которые должны быть возвращены обратно в библиотеку… Мое намерение состоит в том, чтобы нажать на Return то, что фиксирует название книги для обработки возврата.. С тем, что у меня есть, когда я print(book) его возвращаю, ничего не означает, что ничего не было взято из щелчка Мои модели

 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)
 

Ответ №1:

если я правильно понял — я считаю, что вам нужно передать 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>
 

я думаю, это должно работать с вашим текущим кодом

Комментарии:

1. Что, если я хочу, чтобы book_pk был реляционным путем, т. е. <имя td=’book_pk’><имя td=’book_pk’><a href=»{% url ‘return_book’ book_pk = заимствовать.book_id.reg_no %}»>Возврат<a href=»{% url ‘return_book’ book_pk = заимствовать.book_id.reg_no %}»></a> </a></td>. Он жалуется на отсутствие обратного совпадения для reg_no. Как бы я изменил???

2. @fakeMake не уверен, что понимаю . что ты пытаешься сделать

3. Могу ли я написать book_pk = заимствовать.book_id.reg_no, и это работает вместо book_pk = заимствовать.book_id…. book_id дает мне название книги, и поэтому, если я нажму «Вернуть», он вернет все книги, заимствованные с этим именем, поэтому получение reg_no может помочь мне получить только одну книгу с reg_no для возврата… Как я могу этого достичь???? Или есть ли возможность, чтобы book_id возвращал reg_no вместо book_name из модели или представления????

4. @fakeMake опубликуйте модель «Проблема», которая, похоже, отсутствует в вашем коде . таким образом, мы можем понять отношения

5. @fakeMake хм, имя, которое у вас немного сбивает с толку, возвращает идентификатор объекта обратно в представление.. попробуйте ` <имя td=’book_pk’><имя td=’book_pk’><a href=»{% url ‘return_book’ book_pk = borrow.book_id.id %}»>Возврат<a href=»{% url ‘return_book’ book_pk = borrow.book_id.id %}»></a> </a></td>`