Как решить проблему: 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})
Спасибо всем!!!