简体   繁体   中英

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. 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.

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. 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

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.

So how do student create their events? Simply create an a inlineformset_factory form to create events on each student's calendar like this:

#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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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