Запись IP-адреса с отправкой формы Django - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь использовать django-ipware pacakge для записи IP-адреса кого-либо, отправляющего отправку формы через Django.

Форма представляет собой ModelForm. Вот модель:

# models.py

from django.db import models


class Upload(models.Model):
    email = models.EmailField()
    title = models.CharField(max_length=100)
    language = models.ForeignKey('about.channel', on_delete=models.CASCADE, default='Other')
    date = models.DateField(auto_now_add=True)
    file = models.FileField()
    ip_address = models.GenericIPAddressField()

Вот форма:

# forms.py

class UploadForm(forms.ModelForm):

    class Meta:
        model = Upload
        fields = ['email', 'title', 'language', 'file']
        labels = {
            'email': 'E-Mail',
            'title': 'Video Title',
            'file': 'Attach File'
        }

Бизнес-логика c для получения IP-адреса довольно проста, но я попытался поместить его в разные места без удачи. Где я должен разместить логи c, чтобы они были отправлены вместе с другими данными формы?

# views.py
from ipware.ip import get_real_ip

ip = get_real_ip(request)

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Я сделал это в функциональном представлении. У меня есть функция просмотра с именем submit_happiness, которая отправляет форму с именем Survey_Form. Перед отправкой формы мое представление submit_happiness получает IP-адрес и добавляет это поле в форму. Форма отправлена ​​на мою Rating модель. Моя Rating модель имеет поле с именем ip.

Моя функция представления submit_happiness здесь.

def submit_happiness(request):
    form = Survey_Form(request.POST or None)
    ip = str(get_client_ip(request)) # I got the IP here!!!!!!!!!!
    saved_ip_query = Rating.objects.filter(ip=ip)
    message = False
    if saved_ip_query:
        message = ('I already have a survey from IP address '
                   f'{ip}. You might have submitted a survey.')
    if form.is_valid():
        new_rating = form.save(commit=False)
        new_rating.ip = ip
        form.save()
        form = Survey_Form()  # clears the user's form input
    context = {
        'form': form, 'message': message
    }
    return render(request, "ratings/submit_happiness.html", context)
0 голосов
/ 21 апреля 2020

Согласно предложению @David Smolinksi сверху, вот как я решил эту проблему:

#view.py 

def upload(request):
    ip = str(get_real_ip(request)) # Retrieve user IP here

    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            new_upload = form.save(commit=False) # save the form data entered on website by user without committing it to the database
            new_upload.ip_address = ip # add the ip_address requested above to all the other form entries as they map to the model
            new_upload.save() # save the completed form
            return redirect('upload')
    else:
        form = UploadForm()

    context = {
        'form': form
    }

    return render(request, 'content/upload.html', context)
...