Python 在使用CreateView保存表单之前,请执行一些操作

Python 在使用CreateView保存表单之前,请执行一些操作,python,django,Python,Django,我想在CreateView中保存实例之前填充GenericPaddress字段。它必须在视图中完成,而不是在表单类中,因为可以访问请求变量。我可以这样做吗?我必须重写哪种方法以及如何重写?我正在使用的代码: 型号.py class Message(models.Model): author = models.CharField(max_length=60) email = models.EmailField() message = models.TextField(max

我想在CreateView中保存实例之前填充GenericPaddress字段。它必须在视图中完成,而不是在表单类中,因为可以访问请求变量。我可以这样做吗?我必须重写哪种方法以及如何重写?我正在使用的代码:

型号.py

class Message(models.Model):
    author = models.CharField(max_length=60)
    email = models.EmailField()
    message = models.TextField(max_length=1200)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)

    def __str__(self):
        return self.author + '/' + self.message[:20]
class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ['author', 'email', 'message']
        labels = {
            'author': 'Autor',
            'email': 'E-mail',
            'message': 'Wiadomość'
        }
class SendMessage(CreateView):
    form_class = MessageForm
    template_name = 'blog/send_message.html'

    def post(self, request, *args, **kwargs):
        result = super(SendMessage, self).post(request, *args, **kwargs)
        ip, is_routable = get_client_ip(request)
        if ip:
            self.fields['ip_address'] = ip  #I do it wrong
        return result
forms.py

class Message(models.Model):
    author = models.CharField(max_length=60)
    email = models.EmailField()
    message = models.TextField(max_length=1200)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)

    def __str__(self):
        return self.author + '/' + self.message[:20]
class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ['author', 'email', 'message']
        labels = {
            'author': 'Autor',
            'email': 'E-mail',
            'message': 'Wiadomość'
        }
class SendMessage(CreateView):
    form_class = MessageForm
    template_name = 'blog/send_message.html'

    def post(self, request, *args, **kwargs):
        result = super(SendMessage, self).post(request, *args, **kwargs)
        ip, is_routable = get_client_ip(request)
        if ip:
            self.fields['ip_address'] = ip  #I do it wrong
        return result
视图.py

class Message(models.Model):
    author = models.CharField(max_length=60)
    email = models.EmailField()
    message = models.TextField(max_length=1200)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)

    def __str__(self):
        return self.author + '/' + self.message[:20]
class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ['author', 'email', 'message']
        labels = {
            'author': 'Autor',
            'email': 'E-mail',
            'message': 'Wiadomość'
        }
class SendMessage(CreateView):
    form_class = MessageForm
    template_name = 'blog/send_message.html'

    def post(self, request, *args, **kwargs):
        result = super(SendMessage, self).post(request, *args, **kwargs)
        ip, is_routable = get_client_ip(request)
        if ip:
            self.fields['ip_address'] = ip  #I do it wrong
        return result

我使用您的代码作为参考,告诉您如何以有效形式访问
请求

有关更多用法,请参阅本文

您能否告诉我如何在此函数中为该表单请求设置
ip\u地址
fileld?覆盖CBVAre的
form\u valid
函数,确保其具有请求参数?我已经编写了基于函数的视图,它可以完成任务。请检查我的答案,我只是将您的代码复制到表单_valid()来给您一个想法。