2017-07-04 80 views
0

我编写了我自己的表单来编辑配置文件,并且需要保存编辑配置文件的用户的ip,但并不真正了解如何执行此操作。我知道,我们可以从request.META['REMORE_ADDR']得到ip,但是在哪里放置这个以及如何保存到我的分区......如果您能提供帮助,将非常高兴。如何在提交django自定义表单后保存用户的IP

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200) 
    date_of_birth = models.DateField() 
    biography = models.TextField() 
    contacts = models.CharField(max_length=200) 
    ip_address = models.GenericIPAddressField(null=True) 

forms.py

class UserEditProfile(forms.ModelForm): 
    first_name = forms.CharField(max_length=30) 
    last_name = forms.CharField(max_length=30) 
    date_of_birth = 
    forms.DateField(widget=SelectDateWidget(years=BIRTH_YEAR_CHOICES)) 
    biography = forms.Textarea() 
    contacts = forms.CharField() 


    def __init__(self, *args, **kw): 
     super(UserEditProfile, self).__init__(*args, **kw) 
     self.fields['first_name'].initial = self.instance.first_name 
     self.fields['last_name'].initial = self.instance.last_name 
     self.fields['date_of_birth'].initial = 
     self.instance.date_of_birth 
     self.fields['biography'].initial = self.instance.biography 
     self.fields['contacts'].initial = self.instance.contacts 


     self.fields.keyOrder = [ 
      'first_name', 
      'last_name', 
      'date_of_birth', 
      'biography', 
      'contacts' 
      ] 

    def save(self, *args, **kw): 
     super(UserEditProfile, self).save(*args, **kw) 
     self.instance.first_name = self.cleaned_data.get('first_name') 
     self.instance.last_name = self.cleaned_data.get('last_name') 
     self.instance.date_of_birth = 
     self.cleaned_data.get('date_of_birth') 
     self.instance.biography = self.cleaned_data.get('biography') 
     self.instance.contacts = self.cleaned_data.get('contacts') 
     self.instance.save() 

    class Meta: 
     model = Profile 
     fields = (
      'first_name', 
      'last_name', 
      'date_of_birth', 
      'biography', 
      'contacts' 
     ) 
     exclude = ['user', 'ip_address'] 

view.py

def edit_profile(request): 
    user = Profile.objects.get(id=request.user.id) 

    if request.method == "POST": 
     form = UserEditProfile(request.POST, instance=user) 

     if form.is_valid(): 
      form.save(commit=False) 
      return redirect('profile') 
    else: 
     form = UserEditProfile(instance=user) 
     args = {'form': form} 
     return render(request, 'edit.html', args) 
+0

您是否尝试过的Django ipware(https://github.com/un33k/django-ipware)用于获取用户的IP? –

回答

0

你不可错过request对象为形式直接。这不是它的工作方式。如果您需要将任何request属性关联到模型实例,则应该在视图中执行此操作。

您可以在视图本身中收集request.META['REMOTE_ADDR'] which gives the IP info of the logged in user in the view and associate it to your实例。

你可以在你的form.is_valid()方法做到这一点,

if form.is_valid(): 
    profile = form.save(commit=False) 
    profile.ip_address = request.META['REMOTE_ADDR'] 
    profile.user = request.user 
    profile.save() 
    return redirect('profile') 
相关问题