Как заполнить «отправитель» автоматически при отправке сообщения другому пользователю?ОЦК - PullRequest
0 голосов
/ 02 марта 2019

Я знаю, что могу использовать сторонние библиотеки сообщений, но хочу научиться создавать свои собственные.Я изо всех сил пытался автоматически установить отправителя в моем CreateMessageForm.

Моем коде ошибки: __init__() got an unexpected keyword argument 'sender'

Формы

class CreateMessageForm(forms.ModelForm):
    reciever = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control form-control-sm','placeholder':'Send to'}))
    title = forms.CharField(max_length=20, widget=forms.Textarea(attrs={'class':'form-control form-control-sm', 'placeholder':'Enter message subject', 'rows':'1'}))
    msg_content = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control form-control-sm', 'placeholder':'Writing your message', 'rows':'10'}))

    class Meta:
        model = Message
        fields = (
            'sender', 'reciever', 'title', 'msg_content',
        )

    def __init__(self, *args, **kwargs):
        sender = kwargs.pop('sender') # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole
        super(CreateMessageForm, self).__init__(*args, **kwargs)

Просмотр

class MessageCreateView(CreateView):
    model = Message

    fields = ['sender', 'reciever', 'title', 'msg_content']

    def get_form_kwargs(self):
        """This method is what injects forms with their keyword
            arguments."""
        # grab the current set of form #kwargs
        kwargs = super(MessageCreateView, self).get_form_kwargs()
        # Update the kwargs with the sender_id
        kwargs['sender'] = self.request.user.id
        return kwargs

Модели

class Message(models.Model):
    sender = models.ForeignKey(User, related_name="sender", on_delete=models.CASCADE)
    reciever = models.ForeignKey(User, related_name="reciever", on_delete=models.CASCADE)
    title = models.CharField(max_length=20)
    ...

Я смотрел на другие темы, но не смог это исправить.

Я попытался выполнить следующее __ init __ () получилнеожиданный аргумент ключевого слова 'user'

Как я могу это исправить, чтобы моя форма автоматически заполняла сообщение "отправитель" автоматически?

1 Ответ

0 голосов
/ 02 марта 2019

Благодаря @DanielRoseman (за руководство и предоставленную ссылку) я понял, как заставить это работать.Это код, если у вас возникла такая же проблема.

class MessageCreateView(CreateView):
    model = Message

    fields = ['reciever', 'title', 'msg_content']

    def form_valid(self, form):
        form.instance.sender = self.request.user
        return super().form_valid(form)

class CreateMessageForm(forms.ModelForm):
    reciever = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control form-control-sm','placeholder':'Send to'}))
    title = forms.CharField(max_length=50, widget=forms.Textarea(attrs={'class':'form-control form-control-sm', 'placeholder':'Enter message subject', 'rows':'1'}))
    msg_content = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control form-control-sm', 'placeholder':'Writing your message', 'rows':'10'}))

    class Meta:
        model = Message
        fields = (
            'reciever', 'title', 'msg_content',
        )
...