Невозможно присвоить "'...'": "ForwardFile.receiver" должен быть экземпляром "User".
Цель здесь состоит в том, чтобы позволить пользователю, загрузившему файл, поделиться им с адресатами, зарегистрированными в системе. Получатель может увидеть файл только тогда, когда он им поделился. Для реализации этой логики у меня есть выпадающий список, в котором предполагаемые получатели запрашиваются из базы данных.
Файл models.py
class ForwardFile(models.Model):
file = models.ForeignKey(Document, related_name='documents', on_delete=models.CASCADE)
receiver = models.ForeignKey(User, related_name='receiver', on_delete=models.CASCADE)
comment = models.TextField()
created_by = models.ForeignKey(User, related_name='documents', on_delete=models.CASCADE)
forwarded_at = models.DateTimeField(auto_now_add=True)
File views.py
для обработки функции пересылки файла
def forward_file(request, file_id):
file = Document.objects.get(pk=file_id)
managers = Manager.objects.all()
users = User.objects.all()
if request.method == 'POST':
form = FileFowardForm(request.POST)
if form.is_valid():
forward = form.save(commit=False)
forward.file = file
forward.receiver = request.POST.get('receiver', '')
forward.created_by = request.user
forward.save()
create_notification(request, file.receiver, 'forward', extra_id=forward.id)
messages.success(request, f"Document Forwarded successfuly to {forward.receiver}")
return redirect('dashboard')
else:
form = FileFowardForm()
return render(request, 'doc/file_forward.html', {'form':form, 'users':users})
Файл forms.py
class FileFowardForm(forms.ModelForm):
class Meta:
model = ForwardFile
fields = ['comment']
Шаблон forward_file.html
{% extends 'core/base.html' %}
{% block content %}
<h2 class="title">Forward {{ file.title}} - {{ file.category }}</h2>
<form action="" method="POST">
{% csrf_token %}
{% if form.errors %}
{% for error in form.errors %}
<div class="notification is-danger">
{{ error }}
</div>
{% endfor %}
{% endif %}
<div class="select">
<select name="receiver">
<option>Select receiver..</option>
{% for user in users %}
{% if user.is_manager %}
<option value="{{ user.id }}">{{ user.first_name|title }} {{ user.last_name|title}}</option>
{% endif %}
{% endfor %}
</select>
</div>
<div class="field">
<label for="comment">Comment</label>
<textarea name="comment" class="textarea" id="id_comment"></textarea>
</div>
<div class="field">
<div class="control">
<button class="button button is-success">Submit</button>
</div>
</div>
</form>
{% endblock content %}
Ошибка происходит в вашем представлении, потому что вы присваиваете строку forward.receiver
вместо экземпляра User
.
Возможно, вам следует изменить эту строку:
forward.receiver = request.POST.get('receiver', '')
на что-то вроде этого
try:
forward.receiver = User.objects.get(
pk=int(request.POST.get('receiver', '')))
exccept (ValueError, User.DoesNotExist):
...
Я предполагаю, что ваш receiver
в POST-запросе является первичным ключом пользователя. В таком случае вы можете установить receiver_id
на первичный ключ User
, на который вы хотите ссылаться:
forward.receiver_id = request.POST.get('receiver', '')