所以我最近添加了一个可选的用户配置文件模型,通过OneToOneField链接到用户,如下所示:
class UserProfile(models.Model): # Creating class
user = models.OneToOneField(User, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
这工作正常,我在此字段中添加之前和之后我的当前UserProfile模型都完好无损,以将配置文件链接到用户.
当我以有效用户身份登录网站时出现问题,在提交登录表单后出现错误:
/ login /的AttributeError
'用户'对象没有属性'个人资料'
我在我的文件中搜索了' User.profile'和类似查询的内容,但是我似乎无法找到任何可以让我以用户身份正确登录的内容.
我不确定在这里发布什么其他代码,并且不希望用可能不必要的代码垃圾邮件这个问题所以请告诉我是否有更具体的内容(views.py,models.py,forms.py等)需要解决这类问题,或者你知道任何可能的解决方案.
谢谢
我正在开发一个Django项目并使表单体验更顺畅我想在几页内传播ModelForm.如果登录的用户可以在不实际发布内容的情况下保存表单中的进度(在这种情况下,JobApplication用户可以返回填写信息而不实际发送应用程序),这将是理想的.
目前我已经看过其他关于SO的答案,比如这个 ; 但这只能告诉我如何利用缓存在表单所在的视图之间存储信息.
Models.py(模型,表格和视图已经简化以便于阅读):
class JobApplication(models.Model):
job = models.ForeignKey(JobPost,on_delete=models.SET_NULL,...)
user = models.ForeignKey(AUTH_USER_MODEL,...)
details = models.CharField(max_length=300)
skills = models.CharField(max_length=300)
feedback = models.CharField(max_length=300)
#... [insert more fields] ...
Run Code Online (Sandbox Code Playgroud)
Forms.py:
class Application(forms.ModelForm):
details = forms.CharField() # To go in page 1 of the form process
skills = forms.CharField() # To go in page 2
feedback = forms.CharField() # To go in page 3
class Meta:
model = JobApplication
fields = ['details','skills','feedback']
Run Code Online (Sandbox Code Playgroud)
Views.py:
from . import forms
def view1(request):
form …Run Code Online (Sandbox Code Playgroud) 我有一个ExampleModel在Django中调用的模型,并且希望每个模型对象都可以唯一标识。但是,我不希望用户在URL中看到对象的ID。因此,出于这个原因,我希望对象slug是唯一的,随机生成的8位整数,该整数将进入视图URL。这与我所见过的其他问题不同,因为这意味着不会生成基于模型对象的名称//内容本身的条形字符串。
Models.py:
class ExampleModel(models.Model):
user = models.ForeignKey(UserModel, related_name='examplemodel', on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=50, verbose_name='Title')
slug = models.SlugField(unique=True, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
目前,Slug的值为null,因此我不必为所有当前ExampleModel对象设置默认的Slug 。
可以理解,这是很模糊的,但是我找不到适合我的实际情况的任何指南/教程。
感谢您提供的任何帮助/指导
编辑 这是我的views.py:
def model_create(request):
user=request.user.id
if request.user.is_authenticated:
try:
example = request.user.examplemodel
except ExampleProfile.DoesNotExist:
example = ExampleProfile(user)
if request.method == 'POST':
form = NewForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('/dashboard/')
else:
return render(request, 'create.html', {'form': form})
else:
form = NewForm()
return render(request, 'create.html', {'form': form})
else:
return redirect('/users/login/?next=')
Run Code Online (Sandbox Code Playgroud)
编辑2 Models.py(保存方法):
def save(self, …Run Code Online (Sandbox Code Playgroud) 我的 Django 项目中有一个 Ajax 函数,类似于以下内容......
$('#btn-submit').click(function(e){
e.preventDefault();
var btn = $(this);
var dataUrl = btn.attr('data-href');
var title = $('#title').val();
var dict = {};
$('.choice-m2m-check').each(function(i){
k = $(this).val();
v = $(this).attr('data-value');
dict[k] = v;
});
$.ajax({
url:dataUrl,
method:'POST',
data:{
'title':title,
'dict':dict,
},
success:function(data){
if (data.saved){
...
}
},
error:function(error){
...
}
});
});
Run Code Online (Sandbox Code Playgroud)
所以我有一个{key: value, ...}字典,它为每个项目分配一个“true”或“false”布尔标志。然后将其发布到由“dataUrl”表示的 URL,Python 在其中对数据进行一些检查。
首先,在 jQuery 中分配键值对后,我使用控制台记录 dict 的值,这在控制台中console.log(dict)提供了类似以下内容的内容。{item-885564895: "true", item-0385245877: "false"}
问题是在我的 Django 视图中,我打印了发布的值,request.POST.get('dict')然后它打印了None. 请注意,当我打印“标题”字段(这是一个常规字符串)时,打印它会返回标题的值。我究竟做错了什么?
我是Python的新手.
我的问题是我想限制已登录的用户无法访问登录和注册页面.
从本质上讲,就是我正在寻找的是类似的@login_required装饰,这将允许访问这些网页的用户谁没有登录.
到目前为止,我有
这是我登录的views.py:
def login_view(request): # Login View to begin user session
print(request.user.is_authenticated())
if request.method == 'POST':
form = UserLogInForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
print(request.user.is_authenticated())
return HttpResponseRedirect('/')
else:
form = UserLogInForm()
return render(request, 'login.html', {'form': form})
else:
form = UserLogInForm()
return render(request, 'login.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
并注册:
class signup_view(View):
form_class = UserSignUpForm
template_name = 'signup.html'
# Blank …Run Code Online (Sandbox Code Playgroud) 我有一个使用Django的站点,它有一个名为'CampaignProfile'的模型 - 并且经过身份验证(登录)的用户可以通过表单创建一个CampaignProfile对象.创建后,可以在经过身份验证的用户个人仪表板上查看模型对象.但是,当我登录到其他用户帐户时,可以在其个人仪表板上查看相同的模型对象.
我如何指定只有任何给定用户创建的对象只能被该用户看到(Django Admin除外)?
dashboard.views.py:
def dashboard_main(request):
if request.user.is_authenticated:
all_campaigns = CampaignProfile.objects.all()
return render(request, 'dashboard-main.html', {'all_campaigns': all_campaigns})
else:
return redirect('/users/login/?next=')
Run Code Online (Sandbox Code Playgroud)
我已经尝试' user.CampaignProfile.objects.all()'当我创建变量' user=request.user.id'时,请求对象的用户只能看到自己的; 但是这会导致错误,说用户没有属性CampaignProfile.虽然我已将CampaignProfile模型的ForeignKey设置为与UserModel(以下模型)相关...
这是我的自定义用户模型accounts.models.py:
class UserModel(AbstractBaseUser):
user_email = models.EmailField(max_length=255, unique=True, verbose_name='Email Address')
user_fname = models.CharField(max_length=30, verbose_name='First Names')
user_lname = models.CharField(max_length=30, verbose_name='Last Name')
dt_joined = models.DateTimeField(auto_now_add=True)
dt_updated = models.DateTimeField(auto_now=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'user_email'
REQUIRED_FIELDS = ['user_fname','user_lname']
Run Code Online (Sandbox Code Playgroud)
任何建议都会很棒,谢谢.
在 Django 中,我@receiver用来保存一个CampaignProfile像这样命名的模型对象:
@receiver(post_save, sender=UserModel)
def save_campaign(sender, instance, created, **kwargs):
if created:
instance.CampaignProfile.save()
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为的自定义用户模型UserModel,它需要与CampaignProfile模型链接,其中 CampaignProfile 看起来像这样......
class CampaignProfile(models.Model):
user = models.ForeignKey(UserModel, related_name='CampaignProfile', on_delete=models.CASCADE, null=True)
campaign_title = models.CharField(max_length=50, verbose_name='Title')
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试通过终端创建新的超级用户时,我收到了这样的错误...
AttributeError: 'RelatedManager' 对象没有属性 'save'
有谁知道为什么创建一个新的超级用户会出现这种错误?谢谢。
我有一个像这样的 Django 模型......
class Example(models.Model):
title = models.CharField(...)
...
Run Code Online (Sandbox Code Playgroud)
我正在尝试比较两个值 -title用户更改之前的字段和title之后的字段。我不想同时将两个值保存在数据库中(只需要一个title字段),因此我想使用pre_save和post_save方法来执行此操作。是否可以在保存之前获取标题,然后保存该值以传递给方法post_save?
pre_save 和 post_save 方法看起来像这样......
@receiver(pre_save, sender=Example, uid='...')
def compare_title_changes(sender, instance, **kwargs):
# get the current title name here
x = instance.title
@receiver(post_save, sender=Example, uid='...')
def compare_title_changes(sender, instance, **kwargs):
# get the new title name here and compare the difference
x = instance.title # <- new title
if x == old_title_name: # <- this is currently undefined, but …Run Code Online (Sandbox Code Playgroud)