无法分配"'..'":"ForwardFile.receiver"必须是"User"实例



这里的目标是允许上传文件的用户与系统中的注册用户的预期接收者共享该文件。只有在与收件人共享文件时,收件人才能看到文件。为了实现这个逻辑,我使用了一个下拉菜单,用于从数据库中查询预期的收件人。

Filemodels.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)

处理文件转发功能的文件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})

Fileforms.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):
...

我假设POST请求中的receiver是用户的主键。那么在这种情况下,你可以将receiver_id设置为你想要链接的User的主键:

forward.receiver_id= request.POST.get('receiver', '')

最新更新