【问题标题】:How to Fix: Cannot resolve keyword 'user' into field. Choices are: description, end_time, id, start_time, title Django Error如何修复:无法将关键字“用户”解析为字段。选项有:description、end_time、id、start_time、title Django 错误
【发布时间】:2019-08-16 07:07:54
【问题描述】:

大家好,我是 Django 的初学者,我正在尝试在我的 django 规划器中实现一个登录系统。

错误:

/login_user/ 处的字段错误 无法将关键字“用户”解析为字段。选项有:description、end_time、id、start_time、title

我尝试在 model.py 上将用户字段添加到我的事件模型中并迁移它,但它只会使整个应用程序崩溃。


views.py

def event(request, event_id=None):
    instance = Event()
    if event_id:
        instance = get_object_or_404(Event, pk=event_id)
    else:
        instance = Event()

    form = EventForm(request.POST or None, instance=instance)
    if request.POST and form.is_valid():
        form.save()
        return HttpResponseRedirect(reverse('cal:calendar'))
    return render(request, 'cal/event.html', {'form': form})

def login_user(request):

    if request.method == "POST":
        
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                events = Event.objects.filter(user=request.user)
                login(request, user)
                return render(request, 'cal/calendar.html', {'calendar': calendar})
            else:
                return render(request, 'cal/login.html', {'error_message': 'Your account has been disabled'})
        else:
            return render(request, 'cal/login.html', {'error_message': 'Invalid login'})
    return render(request, 'cal/login.html')

forms.py

class UserForm(forms.ModelForm):
  password = forms.CharField(widget=forms.PasswordInput)

  class Meta:
    model = User
    fields = ['username', 'email', 'password',]

models.py

from django.contrib.auth.models import Permission, User
from django.db import models

class Event(models.Model):
    #user = models.ForeignKey(User, default=1)
    title = models.CharField(max_length=200)
    description = models.TextField()
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()

    @property
    def get_html_url(self):
        url = reverse('cal:event_edit', args=(self.id,))
        return f'<a href="{url}"> {self.title} </a>'

日历.html

{% extends 'cal/base.html' %}

{% block title %}
Calendar
{% endblock %}

{% block content %}
<div class="clearfix">
    <a class="btn btn-info left" href="{% url 'cal:calendar' %}?{{ prev_month }}"> Previous Month </a>
    <a class="btn btn-info right" href="{% url 'cal:calendar' %}?{{ next_month }}"> Next Month </a>
    <a class="btn btn-info right" href="{% url 'cal:event_new' %}"> New Event </a>
</div>

{{ calendar }}
{% endblock %}

login.html

{% extends 'cal/base_visitor.html' %}
{% block title %}Log In{% endblock %}
{% block login_active %}active{% endblock %}

{% block body %}
<div class="container-fluid">

    <div class="row">
        <div class="col-sm-12 col-md-6">
            <div class="panel panel-default">
                <div class="panel-body">
                    <h3>Log In</h3>
                    {% if error_message %}
                        <p><strong>{{ error_message }}</strong></p>
                    {% endif %}
                    <form class="form-horizontal" role="form" action="{% url 'cal:login_user'%}" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                        <div class="form-group">
                            <label class="control-label col-sm-2" for="id_username">
                                Username:
                            </label>
                            <div class="col-sm-10">
                                <input id="id_username" maxlength="30" name="username" type="text">
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="control-label col-sm-2" for="id_password">
                                Password:
                            </label>
                            <div class="col-sm-10">
                                <input id="id_password" maxlength="30" name="password" type="password">
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-sm-offset-2 col-sm-10">
                                <button type="submit" class="btn btn-success">Submit</button>
                            </div>
                        </div>
                    </form>
                </div>
                <div class="panel-footer">
                    Don't have an account? <a href="{% url 'cal:register' %}">Click here</a> to register.
                </div>
            </div>
        </div>
    </div>

</div>

{% endblock %}

【问题讨论】:

    标签: python django database forms view


    【解决方案1】:

    在您看来,您正在使用关键字 user 过滤事件对象,但您的事件模型没有名为 user 的字段。如果您希望您的事件与用户相关联,您可以在事件模型中添加外键:

    class Event(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
        title = models.CharField(max_length=200)
        description = models.TextField()
        start_time = models.DateTimeField()
        end_time = models.DateTimeField()
    
        @property
        def get_html_url(self):
            url = reverse('cal:event_edit', args=(self.id,))
            return f'<a href="{url}"> {self.title} </a>'
    

    或者,在您看来,您可以简单地通过另一个关键字过滤您的事件对象,您的错误为您提供了选择,而这些选择正是您在模型中指定的字段。所以在你看来你可以这样做:

    def login_user(request):
    
        if request.method == "POST":
    
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)
    
            if user is not None:
                if user.is_active:
                    events = Event.objects.filter(title='Title you want to filter by') # This line seems to be the source of your error. You just need to filter by a keyword that exists in your model.
                    login(request, user)
                    return render(request, 'cal/calendar.html', {'calendar': calendar})
                else:
                    return render(request, 'cal/login.html', {'error_message': 'Your account has been disabled'})
            else:
                return render(request, 'cal/login.html', {'error_message': 'Invalid login'})
        return render(request, 'cal/login.html')
    

    【讨论】:

      【解决方案2】:

      在您的 models.py 中,您错过了为用户表添加关系。添加用户并做一个

      python manage.py makemigrations myapp

      python manage.py migrate myapp

      from django.contrib.auth import get_user_model
      
      class Event(models.Model):
          user = models.ForeignKey(get_user_model(), null=True)
          title = models.CharField(max_length=200)
          description = models.TextField()
          start_time = models.DateTimeField()
          end_time = models.DateTimeField()
      
          @property
          def get_html_url(self):
              url = reverse('cal:event_edit', args=(self.id,))
              return f'<a href="{url}"> {self.title} </a>'
      

      【讨论】:

        猜你喜欢
        • 2012-09-13
        • 2013-04-09
        • 2020-10-06
        • 2020-08-06
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        相关资源
        最近更新 更多