Как передать request.user / user в сообщение в Django - PullRequest
1 голос
/ 10 апреля 2020

Итак, я хочу, чтобы пользователь отправил сообщение другому пользователю. Я хочу, чтобы в поле «отправитель» автоматически указывалось «request.user», а в поле получателя - пользователь, на которого отправитель нажал на странице своего профиля. Как бы я go о передаче этих в форму?

совпадений. 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 

просмотров .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 %}

1 Ответ

0 голосов
/ 10 апреля 2020

Вы можете создать форму без поля sender:

class InstantMessageForm(forms.ModelForm):

    class Meta:
        model = InstantMessage
        <b>fields = ('receiver', 'message')</b>

Затем в представлении вы можете вставить request.user как .sender из .instance, заключенный в форму:

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():
            <b>form.instance.sender = request.user</b>
            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 [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, <b>receiver_id</b>):
    if request.method == 'POST':
        form = InstantMessageForm(request.POST)
        if form.is_valid():
            form.instance.sender = request.user
            <b>form.instance.receiver = get_object_or_404(get_user_mode(), pk=receiver_id)</b>
            form.save()
            return redirect('dating_app:home')
    else:
        form = InstantMessageForm()
    context = {'form':form}
    return render(request, 'dating_app/instant_message_form.html',context)

Затем вам, конечно, нужно соответственно изменить urls.py и URL action, чтобы он включал первичный ключ получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...