Как решить проблему: NOT NULL constraint failed: bloggo_ipaddress.user_id при попытке сохранить ip пользователя

Я пытаюсь использовать фреймворк django и для практики попробовал создать блог. То, что я запрограммировал, кажется, работает довольно хорошо. Единственное, что я пытаюсь сделать и не могу, это добавить поле ip к пользователю (которого я создал с помощью стандартного режима django). Пока что я пытаюсь проверить, сохраняется ли ip в поле, которое я создал, при логировании (log in работает), но это не работает (IntegrityError at /login/.... NOT NULL constraint failed: bloggo_ipaddress.user_id), тогда я хотел бы сделать так, чтобы если пользователь заходит с другим ip, показывалось сообщение. Но пока я хотел бы понять, как правильно хранить ip.

Это мой forms.py с формами входа и регистрации

from django import forms
from django.forms import ModelForm, TextInput
from django.shortcuts import render, redirect
from django.contrib.auth import (authenticate, get_user_model, login, logout,)
from django.contrib.auth.models import User
from bloggo.models import Post
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm


User = get_user_model()

class AuthenticationForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)
    def clean(self, *args, **kwargs):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        if username and password:
            user = authenticate(username=username, password=password)
            if not user:
                raise forms.ValidationError('Wrong username or password')
        return super(AuthenticationForm,self).clean(*args, **kwargs)

class UserRegisterForm(UserCreationForm):
      class Meta:
          model = User
          fields = ('username','email', 'password1','password2',)

Это мой models.py с моделью Post и добавлением поля ip в модель User

from django.conf import settings
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from bloggo.utils import sendTransaction
import hashlib


class Post(models.Model):
    user =  models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, default="", editable=True)
    datetime = models.DateTimeField(auto_now_add=True)
    created_date = models.DateTimeField(default=timezone.now)
    content = models.TextField()
    published_date = models.DateTimeField(blank=True, null=True)
    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class IpAddress(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ip = models.GenericIPAddressField()

Admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import Post, IpAddress

admin.site.register(Post)

class IpaddressInline(admin.StackedInline):
      model = IpAddress
      can_delete = False
      verbose_name_plural ="ipaddress"

class UserAdmin(BaseUserAdmin):
      inlines = (IpaddressInline,)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Мой вид входа

def login(request):
    context = {}
    form = AuthenticationForm(request.POST)
    if request.POST:
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            ip_address = request.META.get('HTTP_X_FORWARDED_FOR')
            if ip_address:
                ipaddress = x_forwarded_for.split(',')[-1].strip()
            else:
                ipaddress = request.META.get('REMOTE_ADDR')
                get_ip = IpAddress()
                get_ip.ip = ipaddress
                get_ip.save()
            user = authenticate(username=username, password=password)
            login(request, user)
            return render(request, 'bloggo/Dashboard.html', context)
    return render(request, 'bloggo/Login_form.html', {'form': form})

Спасибо всем!!!

Вернуться на верх