Невозможно присвоить "'...'": "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', '')
Вернуться на верх