Django pre-filling data in form from URL

依然范特西╮ 提交于 2019-12-11 09:58:51

问题


So i have a button on my detailView page for my model 'patient', and that takes you to a createView for my other model 'appointment'. What i want is the foreign key field of the appointment to be pre-filled depending on what detailView i come from. Here is my code so far:

urls.py:

# /patients/appointment/add
url(r'appointment/add/$', views.appointmentCreate.as_view(), name='appointment-create'),

models.py:

class patient(models.Model):
    TITLE_CHOICES = (
        ('Mr', 'Mr'),
        ('Mrs', 'Mrs'),
        ('Ms', 'Ms'),
        ('Miss', 'Miss'),
    )

    Title = models.CharField(max_length=100, blank=True, choices=TITLE_CHOICES)
    First_Name = models.CharField(max_length=250, default='')
    Surname = models.CharField(max_length=250, default='')
    DOB = models.DateField()

class appointment(models.Model):
    Patient = models.ForeignKey(patient, on_delete=models.CASCADE)

views.py:

class appointmentCreate(LoginRequiredMixin, CreateView):
    model = appointment
    fields = ['Patient', 'Date', 'Time', 'Duration', 'Location', 'Clinician', 'AppointmentType']

form-template.html:

<body>

{% for field in form %}
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <span class="text-danger small">{{ field.errors }}</span>
        </div>
        <label class="control-label col-sm-2">{{ field.label_tag }}</label>
        <div class="col-sm-10">{{ field }}</div>
    </div>
{% endfor %}
</body>

appointment_form.html:

<div class="container-fluid">

    <div class="row">
        <div class="col-lg-12">
            <div class="panel panel-default">
                <div class="panel-body">
                    <h3>Add new appointment</h3>
                    <form class="form-horizontal" action="" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                        {% include 'patients/form-template.html' %}
                        <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>

        </div>

    </div>

</div>

The button from the detailView of patient to create appointment:

<ul class="nav nav-pills" style="margin-bottom: 10px;">
    <li role="presentation" class="active"><a href="{% url 'patients:index' %}">View All</a></li>
    <li role="presentation"><a href="{% url 'patients:appointment-create' %}">Add New Appointment</a></li>
</ul>

For example, the url might be /appname/appointment/add/?Patient=pk , where the end part determines what the value of Patient will be. I have looked into the get_initial function but do not understand how it can help me achieve this. Any help is appreciated. I am relatively new to django so please nothing too complex.

Edit: I have added this code to my model, thanks to Dimitris Kougioumtzis:

def get_context_data(self, **kwargs):
    context = super(appointmentCreate, self).get_context_data(**kwargs)
    context['patient_id'] = self.request.GET.get('patient')
    return context

How do i implement this code?


回答1:


first you create a modelForm:

from django import forms
from your_app.models import appointment

class AppointmentForm(forms.ModelForm):
 class Meta:
    model = appointment
    fields = ['Patient', 'Date', 'Time', 'Duration', 'Location',   'Clinician', 'AppointmentType']

Then you pass the model form in your CreateView:

 class appointmentCreate(LoginRequiredMixin, CreateView):
    model = appointment
    form_class = AppointmentForm

    def get_initial(self):
      patient = self.request.GET.get('patient')
      return {
        'patient': patient,
      }

and Your patient choicefield will be populated based on the request get parameter



来源:https://stackoverflow.com/questions/49463178/django-pre-filling-data-in-form-from-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!