জ্যাঙ্গো কি এমভিসি লঙ্ঘন করছে?


16

আমি স্রেফ জেঙ্গোর সাথে বসন্তের এমভিসির কয়েক বছর ধরে কাজ শুরু করেছি এবং ফর্মগুলি বাস্তবায়ন হরতাকে কিছুটা পাগল বলে মনে হচ্ছে। যদি আপনি পরিচিত না হন তবে জ্যাঙ্গো ফর্মগুলি এমন একটি ফর্ম মডেল শ্রেণীর সাথে শুরু হয় যা আপনার ক্ষেত্রগুলি সংজ্ঞায়িত করে। ফর্ম-ব্যাকিং অবজেক্টের সাথে একইভাবে বসন্ত শুরু হয়। তবে যেখানে স্প্রিং আপনার জেএসপির মধ্যে ব্যাকিং অবজেক্টে বাঁধার ফর্ম উপাদানগুলির জন্য একটি ট্যাগলিব সরবরাহ করে , জ্যাঙ্গোতে ফর্ম উইজেটগুলি সরাসরি মডেলের সাথে আবদ্ধ। ডিফল্ট উইজেট রয়েছে যেখানে আপনি সিএসএস প্রয়োগ করতে আপনার ক্ষেত্রগুলিতে শৈলীর বৈশিষ্ট্যগুলি যুক্ত করতে পারেন বা নতুন ক্লাস হিসাবে সম্পূর্ণ কাস্টম উইজেটকে সংজ্ঞায়িত করতে পারেন। এটি সব আপনার অজগর কোডে চলে যায়। এটা আমার কাছে বাদাম বলে মনে হচ্ছে প্রথমত, আপনি সরাসরি আপনার মডেলটিতে আপনার দৃষ্টিভঙ্গি সম্পর্কিত তথ্য রাখছেন এবং দ্বিতীয়ত আপনি একটি নির্দিষ্ট দৃশ্যে আপনার মডেলকে আবদ্ধ করছেন। আমি কিছু অনুপস্থিত করছি?

সম্পাদনা: অনুরোধ হিসাবে কিছু উদাহরণ কোড।

জ্যাঙ্গো:

# Class defines the data associated with this form
class CommentForm(forms.Form):
    # name is CharField and the argument tells Django to use a <input type="text">
    # and add the CSS class "special" as an attribute. The kind of thing that should
    # go in a template
    name = forms.CharField(
                widget=forms.TextInput(attrs={'class':'special'}))
    url = forms.URLField()
    # Again, comment is <input type="text" size="40" /> even though input box size
    # is a visual design constraint and not tied to the data model
    comment = forms.CharField(
               widget=forms.TextInput(attrs={'size':'40'}))

স্প্রিং এমভিসি:

public class User {
    // Form class in this case is a POJO, passed to the template in the controller
    private String firstName;
    private String lastName;
    get/setWhatever() {}
}

<!-- JSP code references an instance of type User with custom tags -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!-- "user" is the name assigned to a User instance -->
<form:form commandName="user">
      <table>
          <tr>
              <td>First Name:</td>
              <!-- "path" attribute sets the name field and binds to object on backend -->
              <td><form:input path="firstName" class="special" /></td>
          </tr>
          <tr>
              <td>Last Name:</td>
              <td><form:input path="lastName" size="40" /></td>
          </tr>
          <tr>
              <td colspan="2">
                  <input type="submit" value="Save Changes" />
              </td>
          </tr>
      </table>
  </form:form>

"আপনার মডেলটিতে সরাসরি আপনার দৃশ্য সম্পর্কে তথ্য"? দয়া করে নির্দিষ্ট করুন "আপনার মডেলকে একটি নির্দিষ্ট দৃশ্যে আবদ্ধ"? দয়া করে নির্দিষ্ট করুন কংক্রিট, নির্দিষ্ট উদাহরণ সরবরাহ করুন। এইরকম একটি সাধারণ, হাত-avingেউয়ের অভিযোগটি বোঝা মুশকিল, খুব কম সাড়া দেওয়া।
এস .লট

আমি এখনও কিছু তৈরি করি নি, কেবল ডকগুলি পড়ছি। আপনি সিএসএস ক্লাসের সাথে একটি এইচটিএমএল উইজেটকে সরাসরি পাইথন কোডে বাঁধেন Form এটাই আমি ডাকছি।
জিগি

আপনি আর এই বাঁধাই করতে চান? আপনি যে নির্দিষ্ট জিনিসটির প্রতিবাদ করছেন তাতে দয়া করে একটি উদাহরণ বা একটি লিঙ্ক বা একটি উদ্ধৃতি সরবরাহ করুন । অনুমানমূলক যুক্তি অনুসরণ করা শক্ত।
এস .লট

আমি করেছিলাম. স্প্রিং এমভিসি এটি কী করে তা দেখুন। আপনি নিজের দৃষ্টিতে ফর্ম-ব্যাকিং অবজেক্টটি (জ্যাঙ্গো ফর্ম শ্রেণীর মতো) ইনজেক্ট করুন। তারপরে আপনি ট্যাগটিবলগুলি ব্যবহার করে আপনার এইচটিএমএল লিখেন যাতে আপনি আপনার এইচটিএমএলকে সাধারণ হিসাবে ডিজাইন করতে পারেন এবং কেবল একটি পথের বৈশিষ্ট্য যুক্ত করতে পারেন যা এটি আপনার ফর্ম-ব্যাকিং অবজেক্টের বৈশিষ্ট্যে আবদ্ধ হবে।
জিগি

আপনি কী আপত্তি করছেন তা পুরোপুরি পরিষ্কার করতে দয়া করে প্রশ্নটি আপডেট করুন। প্রশ্ন অনুসরণ করা কঠিন। আপনার পয়েন্টটি পুরোপুরি পরিষ্কার করার জন্য এটির কোনও উদাহরণ কোড নেই ।
এস্লট

উত্তর:


21

হ্যাঁ, জাঙ্গো ফর্মগুলি এমভিসি দৃষ্টিকোণ থেকে গোলমাল, মনে করুন আপনি একটি বড় এমএমও সুপার-হিরো গেমটিতে কাজ করছেন এবং আপনি হিরো মডেলটি তৈরি করছেন:

class Hero(models.Model):
    can_fly = models.BooleanField(default=False)
    has_laser = models.BooleanField(default=False)
    has_shark_repellent = models.BooleanField(default=False)

এখন আপনাকে এর জন্য একটি ফর্ম তৈরি করতে বলা হবে, যাতে এমএমও খেলোয়াড়রা তাদের নায়কদের সুপার সুপার পাওয়ারগুলি ইনপুট করতে পারে:

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero

যেহেতু শার্ক প্রতিরোধক একটি খুব শক্তিশালী অস্ত্র, তাই আপনার বস আপনাকে এটি সীমাবদ্ধ করতে বলেছিলেন। যদি কোনও নায়কের কাছে শার্ক রেপিলেন্ট থাকে তবে সে উড়তে পারে না। বেশিরভাগ লোকেরা যা করেন তা হ'ল এই ব্যবসায়ের নিয়মটি পরিষ্কার ফর্মটিতে যুক্ত করুন এবং এটিকে একটি দিন বলুন:

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero

    def clean(self):
        cleaned_data = super(HeroForm, self).clean()
        if cleaned_data['has_shark_repellent'] and cleaned_data['can_fly']:
            raise ValidationError("You cannot fly and repel sharks!")

এই নিদর্শনটি দুর্দান্ত দেখায় এবং ছোট প্রকল্পগুলিতে কাজ করতে পারে তবে আমার অভিজ্ঞতায় একাধিক বিকাশকারীদের সাথে বড় প্রকল্পগুলিতে এটি বজায় রাখা খুব কঠিন। সমস্যাটি হ'ল ফর্মটি এমভিসির দেখার অংশ । সুতরাং আপনাকে প্রতিবার সেই ব্যবসায়িক নিয়মটি মনে রাখতে হবে:

  • হিরো মডেলটির সাথে সম্পর্কিত অন্য একটি ফর্ম লিখুন।
  • এমন একটি স্ক্রিপ্ট লিখুন যা অন্য গেম থেকে নায়কদের আমদানি করে।
  • গেম মেকানিক্সের সময় মডেল উদাহরণটি ম্যানুয়ালি পরিবর্তন করুন।
  • প্রভৃতি

এখানে আমার বক্তব্যটি হ'ল ফর্ম.পি সমস্ত ফর্ম লেআউট এবং উপস্থাপনা সম্পর্কিত, আপনি স্প্যাগেটি কোডের সাথে জগাখিচুড়ি না করা অবধি আপনার কখনই সেই ফাইলটিতে ব্যবসায়িক যুক্তি যুক্ত করা উচিত নয়।

হিরো সমস্যা হ্যান্ডেল করার সর্বোত্তম উপায় হ'ল মডেল পরিষ্কার পদ্ধতি এবং একটি কাস্টম সংকেত ব্যবহার করা। মডেল ক্লিন ফর্মটি পরিষ্কারের মতো কাজ করে তবে এটি স্বয়ং মডেলটিতে সঞ্চিত থাকে, যখনই হিরোফর্ম পরিষ্কার হয় এটি স্বয়ংক্রিয়ভাবে হিরো ক্লিন পদ্ধতিতে কল করে। এটি একটি ভাল অনুশীলন কারণ অন্য কোনও বিকাশকারী যদি হিরোর জন্য অন্য কোনও ফর্ম লিখেন তবে তিনি নিখরচায় / ফ্লাই বৈধতা বিনামূল্যে পাবেন।

পরিষ্কারের সাথে সমস্যাটি কেবল তখনই বলা হয় যখন কোনও ফর্মের মাধ্যমে কোনও মডেল সংশোধিত হয়। আপনি যখন এটি ম্যানুয়ালি () সংরক্ষণ করেন তখন কল হয় না এবং আপনি আপনার ডাটাবেসে কোনও অবৈধ নায়ককে দিয়ে শেষ করতে পারেন। এই সমস্যাটি মোকাবেলার জন্য, আপনি এই শ্রোতাটিকে আপনার প্রকল্পে যুক্ত করতে পারেন:

from django.db.models.signals import pre_save

def call_clean(sender, instance, **kwargs):
    instance.clean()
pre_save.connect(call_clean, dispatch_uid='whata')

এটি আপনার সমস্ত মডেলের জন্য প্রতিটি সেভ () কলটিতে পরিষ্কার পদ্ধতি কল করবে।


এটি একটি খুব সহায়ক উত্তর। তবে, আমার বেশিরভাগ ফর্ম এবং সংশ্লিষ্ট বৈধতার বেশ কয়েকটি মডেলের বেশ কয়েকটি ক্ষেত্র জড়িত। আমি মনে করি এটি বিবেচনা করা খুব গুরুত্বপূর্ণ একটি দৃশ্য is আপনি কীভাবে কোনও মডেলের পরিষ্কার পদ্ধতিতে এই জাতীয় বৈধতাটি সম্পাদন করবেন?
ববোর্ট

8

আপনি পুরো স্ট্যাকটি মিশ্রণ করছেন, বেশ কয়েকটি স্তর জড়িত রয়েছে:

  • একটি জ্যাঙ্গো মডেল ডেটা স্ট্রাকচারকে সংজ্ঞায়িত করে।

  • একটি জ্যাঙ্গো ফর্ম হ'ল এইচটিএমএল ফর্মগুলি, ক্ষেত্রের বৈধতা এবং পাইথন / এইচটিএমএল মান অনুবাদগুলি সংজ্ঞায়িত করার জন্য একটি শর্টকাট। এটি কঠোরভাবে প্রয়োজন হয় না, তবে প্রায়শই কার্যকর।

  • একটি জ্যাঙ্গো মডেলফর্ম হল অন্য শর্টকাট, সংক্ষেপে একটি ফর্ম সাবক্লাস যা একটি মডেল সংজ্ঞা থেকে তার ক্ষেত্রগুলি পায় gets সাধারণ ক্ষেত্রে কেবল একটি সহজ উপায় যেখানে ডাটাবেসে ডেটা প্রবেশের জন্য কোনও ফর্ম ব্যবহৃত হয়।

এবং পরিশেষে:

  • জ্যাঙ্গো স্থপতিরা এমভিসি কাঠামোর সাথে যথাযথভাবে মানেন না। কখনও কখনও তারা এটিকে এমটিভি বলে (মডেল টেম্পলেট ভিউ); কারণ নিয়ামক হিসাবে তেমন কিছুই নেই, এবং টেমপ্লেটের মধ্যে বিভাজন (কেবল উপস্থাপনা, কোনও যুক্তি নয়) এবং দেখুন (কেবল ব্যবহারকারী-মুখোমুখি যুক্তি, কোনও এইচটিএমএল) মডেলের বিচ্ছিন্নতার মতোই গুরুত্বপূর্ণ।

কিছু লোক এটাকে ধর্মবিরোধী হিসাবে দেখে; তবে এটি মনে রাখা গুরুত্বপূর্ণ যে এমভিসি মূলত জিইউআই অ্যাপ্লিকেশনগুলির জন্য সংজ্ঞায়িত হয়েছিল এবং এটি ওয়েব অ্যাপ্লিকেশনগুলির জন্য একটি বরং বিশ্রী ফিট।


তবে উইজেটগুলি উপস্থাপনা হয় এবং সেগুলি সরাসরি আপনার ফর্মটিতে তারযুক্ত হয়। অবশ্যই, আমি সেগুলি ব্যবহার করতে পারি না তবে তারপরে আপনি বাঁধাই এবং বৈধতার সুবিধাটি হারাবেন। আমার বক্তব্যটি হ'ল স্প্রিং আপনাকে বাঁধাই এবং বৈধতা দেয় এবং মডেল এবং দৃশ্যের সম্পূর্ণ পৃথকীকরণ দেয়। আমি মনে করি জাজানো সহজেই একই রকম কিছু বাস্তবায়ন করতে পারত। এবং আমি ইউআরএল কনফিগারেশনটিকে ফ্রন্ট কন্ট্রোলারে অন্তর্নির্মিত ধরণের হিসাবে দেখি যা স্প্রিং এমভিসির জন্য বেশ জনপ্রিয় প্যাটার্ন।
জিগি

সংক্ষিপ্ততম কোড জিতেছে।
কেভিন ক্লিন

1
@ জিগি: ফর্মগুলি উপস্থাপনার অংশ, বাঁধাই এবং বৈধতা কেবল ব্যবহারকারী-প্রবেশ করা ডেটার জন্য। মডেলগুলির নিজস্ব বাঁধাই এবং বৈধতা রয়েছে, ফর্মগুলি থেকে পৃথক এবং স্বতন্ত্র। মডেলফর্মটি যখন তাদের 1: 1 (বা প্রায়) হয় তখন কেবল শর্টকাট হয়
জাভিয়ার

কেবলমাত্র একটি সামান্য নোট যে, হ্যাঁ, এমভিসি ওয়েব অ্যাপ্লিকেশনগুলিতে সত্যিকার অর্থে কোনও ধারণা দেয়নি ... যতক্ষণ না এজেএক্স এটিকে আবার ফিরিয়ে দেয়।
আলেকজান্ডার

ফর্ম প্রদর্শন ভিউ হয়। ফর্ম বৈধতা নিয়ামক। ফর্ম ডেটা মডেল। আইএমও, কমপক্ষে। জ্যাঙ্গো তাদের একসাথে munges। পেডেন্ট্রি একদিকে রেখে, এর অর্থ হ'ল আপনি যদি ডেডিকেটেড ক্লায়েন্ট-সাইড বিকাশকারীদের নিয়োগ করেন (যেমন আমার সংস্থাটি করে) তবে এই পুরো জিনিসটি নিখরখায়ীন is
জিগি

4

আমি এই পুরানো প্রশ্নের উত্তর দিচ্ছি কারণ অন্য উত্তরগুলি উল্লেখ করা নির্দিষ্ট সমস্যাটিকে এড়ানো বলে মনে হচ্ছে।

জ্যাঙ্গো ফর্মগুলি আপনাকে সহজেই সামান্য কোড লিখতে দেয় এবং বুদ্ধিমান ডিফল্ট দিয়ে একটি ফর্ম তৈরি করতে দেয়। যেকোন পরিমাণ কাস্টমাইজেশন খুব দ্রুত "আরও কোড" এবং "আরও কাজ" বাড়ে এবং কিছুটা ফর্ম সিস্টেমের প্রাথমিক সুবিধাটি বাতিল করে দেয়

জাঙ্গো-উইজেট-টুইটের মতো টেম্পলেট লাইব্রেরি কাস্টমাইজিং ফর্মগুলিকে অনেক সহজ করে তোলে। আশা করি ভ্যানিলা জ্যাঙ্গো ইনস্টলেশনের মাধ্যমে এর মতো ফিল্ড কাস্টমাইজেশনগুলি শেষ পর্যন্ত সহজ হবে।

জাঙ্গো-উইজেট-টুইটগুলি সহ আপনার উদাহরণ:

{% load widget_tweaks %}
<form>
  <table>
      <tr>
          <td>Name:</td>
          <td>{% render_field form.name class="special" %}</td>
      </tr>
      <tr>
          <td>Comment:</td>
          <td>{% render_field form.comment size="40" %}</td>
      </tr>
      <tr>
          <td colspan="2">
              <input type="submit" value="Save Changes" />
          </td>
      </tr>
  </table>


1

(আমি ব্যবহার করেছি ইটালিক এই আরো সহজপাঠ্য করতে MVC ধারণা বোঝান।)

না, আমার মতে, তারা এমভিসি ভঙ্গ করে না। জ্যাঙ্গো মডেল / ফর্মগুলির সাথে কাজ করার সময়, একে পুরো এমভিসি স্ট্যাককে মডেল হিসাবে ব্যবহার করার কথা ভাবেন :

  1. django.db.models.Modelবেস মডেল (ডেটা এবং ব্যবসায়িক যুক্তি ধারণ করে)।
  2. django.forms.ModelFormযোগাযোগের জন্য একটি নিয়ামক সরবরাহ করে django.db.models.Model
  3. django.forms.Form(হিসাবে উত্তরাধিকার মাধ্যমে সরবরাহ করা django.forms.ModelForm) হ'ল আপনার সাথে যোগাযোগ করা ভিউ
    • এটি জিনিসগুলিকে ঝাপসা করে তোলে, যেহেতু এটি ModelFormহ'ল একটি Form, তাই দুটি স্তর শক্ত করে একত্রে তৈরি হয়। আমার মতে, এটি আমাদের কোডের ব্রেভিটি এবং জাজানো বিকাশকারীদের কোডের মধ্যে কোড পুনরায় ব্যবহারের জন্য করা হয়েছিল।

এইভাবে, django.forms.ModelForm(এর ডেটা এবং ব্যবসায়িক যুক্তি সহ) নিজেই একটি মডেল হয়ে যায়। আপনি এটিকে (এমভিসি) ভিসি হিসাবে উল্লেখ করতে পারেন, যা ওওপি-তে একটি সাধারণ প্রচলিত বাস্তবায়ন।

উদাহরণস্বরূপ, জাঙ্গোর django.db.models.Modelক্লাস নিন। আমরা যখন django.db.models.Modelঅবজেক্টগুলিতে লক্ষ্য করি তখন আমরা মডেলটি দেখতে পাই যদিও এটি ইতিমধ্যে এমভিসির সম্পূর্ণ বাস্তবায়ন। ধরে নেওয়া মাইএসকিউএল হ'ল পিছনের শেষ ডাটাবেস:

  • MySQLdbহয় মডেল (তথ্য সংগ্রহের স্তর এবং ব্যবসার সংক্রান্ত যুক্তিবিজ্ঞান কিভাবে ইন্টারঅ্যাক্ট সঙ্গে / বৈধকরণ তথ্য)।
  • django.db.models.queryহয় কন্ট্রোলার (থেকে হ্যান্ডলগুলি ইনপুট দেখুন এবং জন্য এটা অনুবাদ মডেল )।
  • django.db.models.Modelহয় দেখুন (কি ব্যবহারকারীর মিথস্ক্রিয়া)।
    • এই ক্ষেত্রে, বিকাশকারীরা (আপনি এবং আমি) 'ব্যবহারকারী'।

এই ইন্টারঅ্যাকশনটি আপনার "ক্লায়েন্ট-পার্শ্ব বিকাশকারী" এর মতো একই জিনিস যখন yourproject.forms.YourForm( django.forms.ModelFormবস্তু থেকে উত্তরাধিকারী ) কাজ করে:

  • আমাদের কীভাবে ইন্টারঅ্যাক্ট django.db.models.Modelকরতে হবে তা জানতে, yourproject.forms.YourFormতাদের (তাদের মডেল ) সাথে কীভাবে ইন্টারঅ্যাক্ট করতে হবে তা জানতে হবে ।
  • যেহেতু আমাদের জানার দরকার নেই MySQLdb, আপনার "ক্লায়েন্ট-সাইড বিকাশকারীদের" সম্পর্কে কিছু জানার দরকার নেই yourproject.models.YourModel
  • উভয় ক্ষেত্রেই, কন্ট্রোলারটি আসলে কীভাবে বাস্তবায়ন করা হয় সে সম্পর্কে আমাদের খুব কমই চিন্তা করা দরকার ।

1
শব্দার্থবিজ্ঞানের বিতর্ক করার পরিবর্তে, আমি কেবলমাত্র আমার টেমপ্লেটগুলিতে আমার এইচটিএমএল এবং সিএসএস রাখতে চাই এবং এটির কোনও .py ফাইলগুলিতে লাগাতে হবে না। দর্শন একদিকে রেখে, আমি এটি একটি ব্যবহারিক পরিণতি অর্জন করতে চাই যা এটি আরও দক্ষ এবং শ্রমের আরও ভাল বিভাজনের জন্য অনুমতি দেয়।
জিগি

1
এটি এখনও পুরোপুরি সম্ভব। আপনি টেমপ্লেটগুলিতে ম্যানুয়ালি আপনার ক্ষেত্রগুলি লিখতে পারেন, ম্যানুয়ালি আপনার মতামতগুলিতে নিজের বৈধতা লিখতে পারেন এবং তারপরে নিজের মডেলগুলি ম্যানুয়ালি আপডেট করতে পারেন। তবে জ্যাঙ্গোর ফর্মগুলির ডিজাইন এমভিসি ভঙ্গ করে না।
জ্যাক এম।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.