简体   繁体   English

将 Django 表单数据保存给用户

[英]Saving Django form data to a User

I'm creating a website for general education uses and one of the features is a calendar section where I would like the user to be able to store their events but then when they login they can view the events they created.我正在创建一个用于一般教育用途的网站,其中一项功能是日历部分,我希望用户能够在其中存储他们的事件,但是当他们登录时,他们可以查看他们创建的事件。 This is for an academic assignment.这是一个学术任务。

I can't seem to get this calendar to link to a user field.我似乎无法将此日历链接到用户字段。 I would like each record in the calendar table to have a user_id which will be the same as the current_user.我希望日历表中的每条记录都有一个与 current_user 相同的 user_id。 I understand that you can user the django default user auth but i have not done that due to not knowing about it and by the time I realized it was too late.我知道您可以使用 django 默认用户身份验证,但由于不知道它,我还没有这样做,当我意识到为时已晚。

So all I really need to do is when the form is valid, I need to assign the value of the current_user id as the value for student in the calendar table.所以我真正需要做的就是当表单有效时,我需要将 current_user id 的值分配为日历表中学生的值。 But for some reason I keep getting problems and the form isn't detected as being valid or the program just doesn't assign the value.但出于某种原因,我不断遇到问题,并且未检测到表单有效或程序未分配值。

My main objective is to have each user view their own calendar.我的主要目标是让每个用户查看他们自己的日历。 I don't mind changing the current student field to a foreign key field我不介意将当前的学生字段更改为外键字段

Student.Views学生.意见

def calendar(request):

student_obj = Student.objects.get(student_name=current_user)
print(student_obj)


if request.method == 'POST':
    form = EventsForm(initial={'student': '3'} or request.POST)
    print(form.errors)

    if form.is_valid():
        form.save()
        all_events = Events.objects.filter(student=student_obj.id)
        messages.success(request, 'Event Has Been Added')
        return render(request, 'Student/calendar.html', {'all_events': all_events})

    else:
        messages.success(request, 'Event Has NOT Been Added')
        all_events = Events.objects.filter(student=student_obj.id)
        return render(request, 'Student/calendar.html', {'all_events': all_events})

Student.Models学生模型

class Student(models.Model):
     student_name = models.CharField(max_length=59, default=None)
     username = models.CharField(max_length=59)
     password = models.CharField(max_length=59)
     age = models.PositiveIntegerField()
     date_of_birth = models.DateField(max_length=10)
     form = models.CharField(max_length=3)
     email = models.EmailField(max_length=59)
     present = models.PositiveIntegerField(default=0)
     late = models.PositiveIntegerField(default=0)
     absent = models.PositiveIntegerField(default=0) 
     maths_grade = models.PositiveIntegerField(default=0)
     english_grade = models.PositiveIntegerField(default=0)
     science_grade = models.PositiveIntegerField(default=0)
     behaviour_level = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.student_name

class Events(models.Model):
    student = models.CharField(max_length=200)
    date = models.DateField(max_length=10, default=None)
    event = models.CharField(max_length=200)
    completed = models.BooleanField(default=False)

Student.forms学生表格

class EventsForm(forms.ModelForm):
    class Meta:
        model = Events
        fields = ["event", "completed", "date", "student"]

Calendar Template日历模板

<div class="container" style="color: #fff">
<br/>
{% if messages %}
    {% for message in messages %}

        <div class="alert alert-warning alert-dismissible" roles="alert">
            <button class="close" data-dismiss="alert">
                <small>x</small>
            </button>
            {{ message }}
        </div>

    {% endfor %}
{% endif %}

{% if all_events %}
<div>
<table class="table table-dark table-bordered">

        {% for things in all_events %}


        {% if things.completed %}
            <style>
                .striker {
                    text-decoration: line-through;
                    text-color: black;
                }
            </style>
            <tr class="table-danger striker">
                <td style="color: black">{{ things.date }}</td>
                <td><a href="{% url 'edit' things.id %}", style="color: black">{{ things.event }}</a></td>
                <td><center><a href="{% url 'delete' things.id %}", style="color: black">Delete</a></center></td>
            </tr>

        {% else %}

            <tr>
                <td>{{ things.date }}</td>
                <td ><a href="{% url 'edit' things.id %}", style="color: white">{{ things.event }}</a></td>
                <td><center><a href="{% url 'delete' things.id %}", style="color: white">Delete</a></center></td>
            </tr>

        {% endif %}

        {% endfor %}


</table>
</div>
{% endif %}

Change form.save() to将 form.save() 更改为

event = form.save(commit=False)
event.student = request.user
event.save()

That'll do it.这样就可以了。

Don't make it complicated, this have to be easier.不要让它复杂,这必须更容易。 If I understood what are you trying to do I would create my models as following:如果我理解你想做什么,我会创建我的模型如下:

#model.py

from django.db.models.signals import post_save
from django.dispatch import receiver

class Student(models.Model):
    user= models.OneToOneField(User, null=True) #student is user
    #Define student fields...

class Calendar(models.Model):
    #Defile calender fields here along with its default values ...
    user = models.OneToOneField(Student)

'''
this signal populate calender table with  user_id along with its 
calender fields 
'''     
@receiver(post_save, sender=Student)
def create_student_calender(sender, instance, created, **kwargs):
   if created and not kwargs.get('raw', False):
        calendar = Calender(user=instance)
        calendar.save()



class Event(models.Model):
   calender  = models.ForeignKey(Callender, null=True)
   # Define  event fields here ...

With models structure like this, whenever student create account Calendar model will be populated saved with calendar fields and student's id field.使用这样的模型结构,每当学生创建帐户时,日历模型将填充日历字段和学生的 id 字段。

So how do student create their events?那么学生如何创建他们的活动呢? Simply create an a inlineformset_factory form to create events on each student's calendar like this:只需创建一个 inlineformset_factory 表单即可在每个学生的日历上创建事件,如下所示:

#form.py 

from django.forms import inlineformset_factory
from django import forms

class EventForm(forms.ModelForm):
    #Events form fields here...

    class Meta:
        model  = Event
        fields = ["Event's field"]



EventFormSet = inlineformset_factory(Calender, Event, form=EventForm, 
                                      max_num=1, can_delete=False)

Render this formset with a view for student to create their events,the formset automatically associate student's event to calendar.使用视图呈现此表单集以供学生创建他们的事件,该表单集自动将学生的事件关联到日历。

So you can add your logic to do more.所以你可以添加你的逻辑来做更多的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM