【问题标题】:How to pass request.user / user to message in Django如何将 request.user / user 传递给 Django 中的消息
【发布时间】:2020-07-22 15:01:56
【问题描述】:

所以我想让一个用户向另一个用户发送消息。我希望“发件人”字段自动成为“request.user”,收件人字段成为发件人通过其个人资料页面点击的用户。我将如何将这些传递到表单中?

ma​​tches.html

<div class="container">

    <p>Username: {{ profile }}</p>
    <h5>Your Matches:</h5>
    {% for item in match %}
        <br>
        <p>Username: <br>{{ item.username}}</p>
        <img src="{{  item.photo.url  }}" width="300">
        <p>Bio: <br>{{ item.description }}</p>
        <br>
    {% endfor %}

</div>

forms.py/InstantMessageForm

class InstantMessageForm(forms.ModelForm):

    class Meta:
        model = InstantMessage
        fields = ('receiver','sender','message')


        def save(self, commit=True):
            user = super(InstantMessageForm, self).save(commit=False)
            user.receiver = cleaned_data['receiver']
            user.sender = cleaned_data['sender']
            user.message = cleaned_data['message']


            if commit:
                user.save()

            return user 

views.py/instant_message

def instant_message(request):

    if request.method == 'POST':
        form = InstantMessageForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('dating_app:home')

    else:
        form = InstantMessageForm()


    context = {'form':form}

    return render(request, 'dating_app/instant_message_form.html',context)

models.py

class InstantMessage(models.Model):

    receiver = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'sender',on_delete=models.CASCADE )
    message = models.TextField()

类 InstantMessage(models.Model):

receiver = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'sender',on_delete=models.CASCADE )
message = models.TextField()

instant_message_form.py

{% extends "dating_app/base.html" %}

{% load bootstrap4 %}

{% block content %}



<h1>Start chatting  now!</h1>




    <div class='container'>
        <form method="post" action="{% url 'dating_app:instant_message' %}" >


            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Register</button>
        </form>
    </div>

{% endblock content %}

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以创建没有sender 字段的表单:

    class InstantMessageForm(forms.ModelForm):
    
        class Meta:
            model = InstantMessage
            fields = ('receiver', 'message')

    然后在视图中,您可以将request.user 注入为.instance.sender,封装在表单中:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def instant_message(request):
        if request.method == 'POST':
            form = InstantMessageForm(request.POST)
            if form.is_valid():
                form.instance.sender = request.user
                form.save()
                return redirect('dating_app:home')
        else:
            form = InstantMessageForm()
        context = {'form':form}
        return render(request, 'dating_app/instant_message_form.html',context)

    注意:您可以使用 @login_required decorator [Django-doc].

    为了设置接收器,您的 url 应该例如包含接收器的主键。然后,您也可以从表单中删除 receiver,然后使用:

    from django.contrib.auth import get_user_model
    from django.contrib.auth.decorators import login_required
    from django.shortcuts import get_object_or_404
    
    @login_required
    def instant_message(request, receiver_id):
        if request.method == 'POST':
            form = InstantMessageForm(request.POST)
            if form.is_valid():
                form.instance.sender = request.user
                form.instance.receiver = get_object_or_404(get_user_mode(), pk=receiver_id)
                form.save()
                return redirect('dating_app:home')
        else:
            form = InstantMessageForm()
        context = {'form':form}
        return render(request, 'dating_app/instant_message_form.html',context)

    您当然需要相应地更改urls.pyaction url,使其包含接收者的主键。

    【讨论】:

    • 如何将它传递给模板?我试着去做,但做不到。我把我的模板放在那里。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2019-09-29
    • 2020-05-08
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多