#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>`